快速排序-Java版本
public static void quicksort(int begin, int end, int[] list) {
if (begin < end) {
int temp = 0;
int left = begin, right = end;
int k = begin;
boolean turn = false;
while (left < right) {
if (!turn) {//turn为false时,从右向左
if (list[right] < list[k]) {
temp = list[k];
list[k] = list[right];
list[right] = temp;
k = right;
turn = !turn;
left++;
} else {
right--;
}
} else {//turn为true时,从左向右
if (list[left] > list[k]) {
temp = list[k];
list[k] = list[left];
list[left] = temp;
k = left;
turn = !turn;
right--;
} else {
left++;
}
}
}
quicksort(begin, k-1, list);
quicksort(k+1, end, list);
}
}
通过leetcode测试结果如下(leetcode测试有随机性):
快排核心–通过选定一个基准值(基准值一般默认选择序列的第一个值),一次遍历使得基准值处于新序列”中心“(中心的意思时基准值左边的值全部小于等于基准值,右边的值全部大于等于基准值,再将原序列以基准值的位置(假定值为position)分割为【start,position-1】与【position+1,final】分别重复依据新的基准值遍历重新排序直至序列有序)
几个标记:
标记left记录从前往后寻找得暂停标志位,标记right从后往前寻找暂停标志位,标记key为基准值目前所在位置。从前往后未找到目标值依次left自加1,从前往后找到目标值交换后right自减1,从后往前未找到则right自减1,从后往前未找到则left自加1。
初始值: left=0,right=8,key=0
开始排序
例如下列序列(加黑斜体为基准值):
45 23 64 8 2 59 64 58 23
从序列最右边***right位置***开始找第一个小于45的值23与45交换位置,交换后此时,并且下一波寻找转向
left=1,right=8,key=8
第一次交换结果: 23 23 64 8 2 59 64 58 45
从序列最左边*** left位置***开始找第一个大于45的值64与45交换位置,并且下一波寻找转向,交换后此时
left=3,right=7,key=2
第二次交换结果: 23 23 45 8 2 59 64 58 64
从序列最右边***right位置***开始找第一个小于45的值2与45交换位置,并且下一波寻找转向,交换后此时
left=4,right=4,key=4
第三次交换结果: 23 23 2 8 45 59 64 58 64
从序列最右边***left位置***开始找第一个大于45的值与45交换位置,left到right之间并没有,至此***left==right***,第一遍历完成!
将序列以***45***分割陈两端【23 23 2 8】与【59 64 58 64】,每一段重复上述步骤并再分割直至每个子序列长度为2。
以上就是快排的一种思路