快速排序的基本思想:
选定序列中的一个元素作为枢轴,从序列的右端开始比较,如果找到比枢轴小的数,就记录此时的位置 j ,再从序列的左端开始比较,如果找到一个比枢轴大的数,就记录此时的位置 i ,并将 arr[i] 和 arr[j] 进行交换;直到左右两个索引相遇为止,则一趟排序结束;继续上述步骤,对枢轴的左边和右边再进行快速排序,也就是进行递归;
枢轴的选定,可以以第一个数作为枢轴,从右往左开始比较;或者是选定中间位置的数作为枢轴,从右往左开始比较;
以中间位置的数作为枢轴:
public static void quickSort(int[] arr, int left, int right) {
int l = left; //左索引
int r = right; //右索引
int pivot = arr[(l + r) / 2]; //枢轴
int temp = 0;
while (l != r) {
while (arr[r] > pivot) {
r--;
}
while (arr[l] < pivot) {
l++;
}
if (l >= r) {
break;
}
//交换
if (l < r) {
temp = arr[l];
arr[l] = arr[r];
arr[r] = temp;
}
if (arr[l] == pivot) {
r--;
}
if (arr[r] == pivot) {
l++;
}
}
//向左递归
if (left < r) {
quickSort(arr,left,r - 1);
}
//向右递归
if (right > l) {
quickSort(arr,l + 1,right);
}
}
以第一个数作为枢轴:
public static void quickSort2(int[] arr,int left, int right) {
int i = left;
int j = right;
int temp;
int t;
if (i > j) {
return;
}
temp = arr[i];
while (i != j) {
while (arr[j] >= temp && i < j) {
j--;
}
while (arr[i] <= temp && i < j) {
i++;
}
if (i < j) {
t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}
arr[left] = arr[i];
arr[i] = temp; //放置枢轴在中间的位置
quickSort2(arr,left, i - 1);
quickSort2(arr,i + 1,right);
}