关于原理,虽然很重要,可是在这里不作过多介绍。 由于随便搜索一下。就能够找到更好的答案。java
本质是回顾,记住核心的思想,而后经过code 深入 已有概念的印象。数组
/** * 快速排序的基本方法 * * @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; }
/** * 分治(单循环法) 把 小于基准值的,交换(和基准值的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; }