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;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。