摘要:双边循环法快速排序的基本方法待排序的数组开始的结束的循环次数找到基准位置。需要加限制条件和指针重合点交换单边循环法分治单循环法把小于基准值的,交换和基准值的到的左边待交换的数组起始下标结束下标默认起始位置为基准值基准值的位置,不断移动。
0. 索引 1. 简单介绍
关于原理,虽然很重要,但是在这里不做过多介绍。 因为随便搜索一下。就可以找到更好的答案。
本质是回顾,记住核心的思想,然后通过code 深刻 已有概念的印象。
2. 双边循环法
/**
* 快速排序的基本方法
*
* @param intArr 待排序的数组
* @param startIndex 开始的 index
* @param endIndex 结束的 index
* @return 循环次数
*/
public static long sort(int[] intArr, int startIndex, int endIndex) {
if (startIndex >= endIndex) {
return 0;
}
// 找到基准位置。 位置左边的的都是小于的,位置右边的都是大于的。 + 同事做好了排序
int pivotIndex = doubleSideSortFindPivot(intArr, startIndex, endIndex);
sort(intArr, startIndex, pivotIndex - 1);
sort(intArr, pivotIndex + 1, endIndex);
return 1;
}
/**
* 分治(双边循环法)
*
* @param intArr 待交换的数组
* @param startIndex 起始下标
* @param endIndex 结束下标
*/
public static int doubleSideSortFindPivot(int[] intArr, int startIndex, int endIndex) {
int pivotVal = intArr[startIndex];
int leftIndex = startIndex;
int rightIndex = endIndex;
// MARK : 之前用if leftIndex < rightIndex 报错
while (leftIndex != rightIndex) {
// 之前自己的写法比较混乱
// step 1 :控制 right 指针,左移
// 错误1 : 使用了 if ,毕竟可以一直左移。 逻辑判断 MARK
while (leftIndex < rightIndex && intArr[rightIndex] > pivotVal) {
rightIndex--;
}
// step 2 : 控制 left 指针 右移
while (leftIndex < rightIndex && intArr[leftIndex] <= pivotVal) {
leftIndex++;
}
// step 3 :交换 left 和 right。 需要加限制条件
if (leftIndex < rightIndex) {
int temp = intArr[leftIndex];
intArr[leftIndex] = intArr[rightIndex];
intArr[rightIndex] = temp;
}
}
// 【replace】pivot和指针重合点交换
intArr[startIndex] = intArr[leftIndex];
intArr[leftIndex] = pivotVal;
return leftIndex;
}
3. 单边循环法
/**
* 分治(单循环法) 把 小于基准值的,交换(和基准值的index )到 pivot 的左边
*
* @param intArr 待交换的数组
* @param startIndex 起始下标
* @param endIndex 结束下标
*/
public static int oneSideSort(int[] intArr, int startIndex, int endIndex) {
// 默认起始位置为基准值
int pivotVal = intArr[startIndex];
// 基准值的位置,不断移动。左边的代表交换过来的小于 pivotVal 的
int mark = startIndex;
// 如果小于基准值的,交换,mark 右移
for (int i = startIndex + 1; i <= endIndex; i++) {
// 小于的做交换
if (intArr[i] < pivotVal) {
mark++; // 基准位右移
int temp = intArr[mark];
intArr[mark] = intArr[i];
intArr[i] = temp;
}
}
// 交换
intArr[startIndex] = intArr[mark];
intArr[mark] = pivotVal;
return mark;
}
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/74881.html
摘要:直接插入排序的算法重点在于寻找插入位置。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。简单选择排序常用于取序列中最大最小的几个数时。将新构成的所有的数的十位数取出,按照十位数进行排序,构成一个序列。 1.直接插入排序 直接插入排序算法是排序算法中最简单的,但在寻找插入位置时的效率不高。基本思想就是将一个待排序的数字在已经排序的序列中寻找找到一个插...
摘要:回来更新一波,最近刷剑指,才又发现树真是一个大头,二叉树的题目和变化运用好多啊二叉树算法引子很多人说二叉树没什么卵用,我觉得是他的工资和公司让他跨不过这个坎还有很多人学了一些树的知识,发现也用不上,我想说的是,读一本书体现不了这本书 回来更新一波,最近刷《剑指offer》,才又发现树真是一个大头,二叉树的题目和变化运用好多啊~ /** * PHP二叉树算法 * Create...
摘要:回来更新一波,最近刷剑指,才又发现树真是一个大头,二叉树的题目和变化运用好多啊二叉树算法引子很多人说二叉树没什么卵用,我觉得是他的工资和公司让他跨不过这个坎还有很多人学了一些树的知识,发现也用不上,我想说的是,读一本书体现不了这本书 回来更新一波,最近刷《剑指offer》,才又发现树真是一个大头,二叉树的题目和变化运用好多啊~ /** * PHP二叉树算法 * Create...
阅读 2790·2021-11-23 09:51
阅读 3524·2021-11-22 15:22
阅读 2083·2021-11-18 13:22
阅读 2671·2021-09-24 09:48
阅读 1501·2019-08-29 13:58
阅读 1503·2019-08-26 13:39
阅读 2628·2019-08-26 10:48
阅读 3240·2019-08-26 10:21