概况
昨晚心血来潮,想看一看网上关于快速排序的帖子,发现有些帖子的代码写的很乱,没有简单的把快排写出来,而且还写复杂了:大致就是在while里面又两个并列的while循环,这样的代码不知在一个贴子上发现过,所以我决定写一篇关于排序的问题,在配上动图方便理解
快速排序
核心思想
选中一个元素为基准点
,将其他元素和这个基准点
进行比较,大于则放在基准点的右侧(既然是右侧,那么我就放在最右侧),小于的则放在左侧(既然是左侧,那么我就放在最左侧)。
那么在一次排序完成后,可以得到这样的结果:基准点左侧的数都不大于基准点,右侧的数都不小于基准点
,对应和基准点相同的数,则看自己的处理逻辑是放在左侧还是右侧。
配图
这里 只配了第一次排序的图片,因为太难画了
这里在最后转gif的时候把最后两个ppt的动画去掉了,最后的样子如图所示:
接下来对左边和右边的数据再排序即可
实例代码
public static void sort(int[] arr, int low,int high){
// 退出递归的条件
if (high <= low){
return;
}
int base = arr[low];
int point = low;
int end = high;
point++;
int tmp;
while (high >= point){
if (arr[point] > base){
tmp = arr[high];
arr[high] = arr[point];
high--;
arr[point] = tmp;
int a = 0;
}else {
// 当前的值小于等于标准值,则将该值向前移动一位即可
arr[point-1] = arr[point];
point++;
}
}
point--;
arr[point] = base;
sort(arr,low,point-1);
sort(arr,point+1,end);
}
测试数据:
public static int[] arr = {1,1,2,0,9,3,12,7,8,3,4,65,22};
其他
其他排序后续补充