原理
要求:使用快速排序将 list [2, 2, 3, 1, 5, 7, 4, 6, 9, 8] 数组从小到大排序
在数组中选取第一个值 list[0] 作为枢轴,以此为基准,将大于此值的其他元素放在后半部分,小于此值的元素放在前半部分。
比如,选取 list[0]=2 为枢轴,开始排序,2个索引,一个指向末,一个指向头,从头和尾向中间靠拢。当2个索引值不符合条件时2个索引位置的值交换,当2个索引重合时结束。
先从末端逆向遍历
list[9]=8 >2, 保持不变;
list[8]=9>2, 保持不变;
以此类推…
当list[3]=1<2,list[0] 与list[3] 进行交换,此时list[0]=1,list[3]=2,然后改为从头顺向遍历,
list[0]=1<2,保持不变;
list[1]=2 <= 2,保持不变;
list[2]=3>2,将list[2]=3 与 list[3]=2进行交换,再改为逆向遍历,发现索引重合,至此结束。
那么进行一次排序之后就是
[1, 2, 2, 3, 5, 7, 4, 6, 9, 8]
以2为分界线,前半部分小数组[1,2]都小于等于2(这里还是list这个数组,只是这个小数组遍历的时候是list数组的0–1),后半部分小数组[3,5,7,4,6,9,8]都大于等于2(同理,是list数组的3~9),然后将小数组重复上述步骤,直至排序完成。
QuickSort代码实现
public static void Qsort(int[] list, int low, int high) {
// 用来记录枢轴的位置
int pivot;
if (low < high) {
// 寻找pivot的位置,在寻找过程中已排序
pivot = partition(list, low, high);
//递归调用,即将小数组进行快速排序,第一个是前半部分的小数组,
//第二个是后半部分的小数组
Qsort(list, low, pivot - 1);
Qsort(list, pivot + 1, high);
}
}
//=================================================================
// 数组值交换函数
public static void swap(int[] list, int low, int high) {
int temp = list[low];
list[low] = list[high];
list[high] = temp;
}
//=================================================================
private static int partition(int