快速排序
public class QuickSort {
/*
* java快排, left, right分别为要被排序数组(或部分数组)最小、最大的下标索引
*/
public static void quickSort(int[] array, int left, int right) {
if (right - left < 1) { // 数组长度为1 或 0 时,退出排序
return ;
}
// pivot是一个中心值,比这个值小的放左边,比这个值大的放右边,会形成一个以该值为中心的边界
int pivot = array[left];
int i = left; // 从数组左边界开始
int j = right; // 从数组右边界开始
while (i < j) {
// 这里要先从右边找小于pivot的数,因为排序是从小到大,后面有一步是要更新pivot的值,要把更小的值赋给pivot
// 如果先从左到右开始找,若数组的值均大于pivot如[1,2,3,4,5],i会在index=1的位置跳出循环,直到j=1跳出循环,
// 在更新时pivot会将array[0]与array[1]的值互换从而导致结果错误;
while(array[j] >= pivot && i < j) { // 从右到左找小于pivot的数
j--;
};
while(array[i] <= pivot && i < j) { // 从左到右找大于pivot的数
i++;
};
// 将每次循环得到的第一个小于pivot和大于pivot的数交换位置, i < j的判断可以省略
if (i < j) {
int tmp = array[j];
array[j] = array[i];
array[i] = tmp;
}
} // 循环结束后得到一个左半边(下标<= i,值全部<= pivot)和一个右半边(全部 >= pivot)
// 将pivot与分界线的值互换以 更新pivot
array[left] = array[i]; // 更新pivot(否则左半边的pivot将不变),这里array[i]的值一定会< pivot,
// 除非从left到right都>=pivot
array[i] = pivot;
quickSort(array, left, i - 1);
quickSort(array, i + 1, right);
// slower
/*
// 每次发现比pivot大的值便把这个值放到pivot前面
for (int i = left+1; i <= right; i++) {
if (array[i] < pivot) {
// 逐步将大于pivot的值与前面小于等于pivot互换,直到放到pivot前面
for (int j = i; j > left; j--) {
int tmp = array[j];
array[j] = array[j-1];
array[j-1] = tmp;
}
left++;
}
}
quickSort(array, 0, left-1);
quickSort(array, left+1, right);
*/
}
}