思路分析:
取数组最中间的那个数为基数(取哪一个数为基数都可以,取中间的只是为了好理解),在左边找一个比基数大的数,在右边找一个比基数小的数,如果找到就交换两个数的位置,交换过后再向下寻找,直到左边的角标大于等于右边则退出,一轮排序后,基数的左边一定都是比基数小的,基数的右边一定是比基数大的,(注意:基数不一定还在原来的位置,可能出现在基数左边找不到比基数大的数,故而左边找到的数只能是基数本身,而右边找到的数小于基数,此时,仍会发生交换,交换过后,右边的数就是基数本身,然后左边的角标+1,再比较左边的数是否大于基数,大于就交换,以此循环),然后递归基数左边的所有元素(角标从left — r)结束后递归基数右边所有元素(角标 l — right)
代码展示:
public static void quickSort(int[] arr, int left, int right) {
int l = left;
int r = right;
int pivot = arr[(left + right) / 2];
int temp;
while (l < r) {
while (arr[l] < pivot) {
l++;
}
while (arr[r] > pivot) {
r--;
}
if (l >= r) {
break;
}
temp = arr[l];
arr[l] = arr[r];
arr[r] = temp;
if (arr[l] == pivot) {
r--;
}
if (arr[r] == pivot) {
l++;
}
}
if (l == r) {
l++;
r--;
}
if (left < r) {
quickSort(arr, left, r);
}
if (right > l) {
quickSort(arr, l, right);
}
}
效率更高的一种快排
public static void quickSort2(int [] arr,int left,int right) {
int pivot=0;
if(left<right) {
pivot=partition(arr,left,right);
quickSort2(arr,left,pivot-1);
quickSort2(arr,pivot+1,right);
}
}
private static int partition(int[] arr,int left,int right) {
int key=arr[left];
while(left<right) {
while(left<right && arr[right]>=key) {
right--;
}
arr[left]=arr[right];
while(left<right && arr[left]<=key) {
left++;
}
arr[right]=arr[left];
}
arr[left]=key;
return left;
}