以上为思路。
总的来说,快速排序也是利用了分治法的思想。
基本步骤:1.先选择好合适的主元pivot,
2.然后再把比主元小的元素放到主元的左边(右边),把较大的元素放到主元的右边(左边),
3.接着再以主元为分界点,把数组分为两个部分,再分别对两边的数组重复第二步的操作,
4.最后便实现了有序排列。
快速排序的时间复杂度为O(NlgN),这是一种不稳定的排序方法。
以下代码实现
public static void quickSort(int arr[], int left, int right) {
int index = partition(arr, left, right);
if (left < index - 1)
quickSort(arr, left, index - 1);
if (index < right)
quickSort(arr, index, right);
}
//以二分法的思路对数组分组
private static int partition(int arr[], int left, int right){
int i = left, j = right;
int tmp;
//以最左边、最右边、中间三个数的中位数为主元
int pivot = findPivot(arr, left, (left+right)>>1, right);
while (i <= j) {
while (arr[i] < pivot)
i++;
while (arr[j] > pivot)
j--;
if (i <= j) {
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
i++;
j--;
}
}
return i;
}
//确定主元
private static int findPivot(int[] nums, int left, int mid, int right){
if(nums[left] > nums[right]) {
int temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
}
if(nums[left] > nums[mid]) {
int temp = nums[left];
nums[left] = nums[mid];
nums[mid] = temp;
}
if(nums[mid] > nums[right]) {
int temp = nums[right];
nums[right] = nums[mid];
nums[mid] = temp;
}
return nums[mid];
}