快速排序原理,演示及代码
快速排序原理及代码
1.原理(分治)
一次遍历将随机数列分为左右两区,使得左区所有数字小于基数小于右区,两区再分别重复策略,实现快速排序。
2.操作
- 在随机数列随机选取一个数字作为基数(一般选取第一个数字-简单)
- 将数列中小于基数的数字放入基数左侧,反之放右侧(一般采用双指针方式)
- 左右两侧分别使用以上策略,直到本侧只有一个数字为止(递归实现)
3.演示
初始数列:5 2 9 4 7 1 6 3
选取基数:tmp=5 (存储起来),采用双指针遍历:红色代表low(应小于基数),蓝色代表high(应大于基数),从high开始执行;
5 2 9 4 7 1 6 3
3<基数5,令arr[low]=arr[high],low++
3 2 9 4 7 1 6 3
每赋值一次便交换一次执行方向:2<基数5,low++
3 2 9 4 7 1 6 3
9<基数5,arr[high]=arr[low],high--
3 2 9 4 7 1 6 9
6>基数5,high--
3 2 9 4 7 1 6 9
1<基数5,arr[low]=arr[high],low++
3 2 1 4 7 1 6 9
4<基数5,low++
3 2 1 4 7 1 6 9
7>基数5,arr[high]=arr[low],high--
3 2 1 4 7 7 6 9
此时红色low与蓝色high相遇变成了紫色,遍历结束,令紫色位置=tmp
3 2 1 4 5 7 6 9
下面运用递归将左右两区分别重复此操作,直至每区长度等于1,则递归结束,快排完成。
4.代码
/**
* @param arr 随机数组
* @param low 本分区的开头
* @param high 本分区的结尾
* @return 排序后的数组
*/
public int[] quickSort(int[] arr, int low, int high) {
if (low >= high) {
return arr;
}
int tmp = arr[low], originLow = low, originHigh = high;
int flag = 1;//1表示从右到左
while (low != high) {
if (flag == 1) {
if (arr[high] <= tmp) {
arr[low] = arr[high];
low++;
flag = 0;
} else {
high--;
}
} else {
if (arr[low] >= tmp) {
arr[high] = arr[low];
high--;
flag = 1;
} else {
low++;
}
}
}
arr[low] = tmp;
arr = quickSort(arr, originLow, low - 1);
arr = quickSort(arr, low + 1, originHigh);
return arr;
}

浙公网安备 33010602011771号