此文章写java版的快速排序
总体的思想就是 在数组中找一个参照物 一般选择数组的第一个或者最后一个元素, 我选择的是最后一个 代码中有介绍
吧最后一个当最key 先从前往后挨个找 找到大于key的放到后面, 然后在最后一个位子-- 向前移动,之后在从后向前找,直到找到小于key的 放到之前开始的哪个位子, 因为开始的数据已经放到的最后 现在已经空了, 然后一直重复
原数组 {11,2,5,3,7,9,9} 每部执行之后
[7, 2, 5, 3, 9, 9, 11]
[2, 3, 5, 7, 9, 9, 11]
[2, 3, 5, 7, 9, 9, 11]
[2, 3, 5, 7, 9, 9, 11]
[2, 3, 5, 7, 9, 9, 11]
import java.util.Arrays;
public class QuickSort {
public static void main(String[] args) {
int[] arr = {11,2,5,3,7,9,9};
qSort(arr);
System.out.println(Arrays.toString(arr));
}
public static void qSort(int[] arr){
if(arr == null || arr.length < 1)return;
int low = 0;
int high = arr.length -1;
partationSort(arr, low, high);
}
/**
* 快速排序方法,需要传入数组和和想要排序的区间 排序方式从小到大
* 默认对比的key是数组的最后一个
* @param arr 需要排序的数组
* @param low 需要排序的数组的区间 的开始索引
* @param high 需要排序的数组的区间 的结束的索引 区间包头包尾
* @return 返回最后key所在的索引 便于之后继续调用递归将被分开的段进行排序
*/
public static void partationSort(int[] arr, int low, int high){
int startIndex = low;
int endIndex = high;
int key = arr[high];//选择数组的最后一位作为key
while (startIndex < endIndex){
//首先从前向后找 知道找到比比key大的元素
while (startIndex < endIndex && arr[startIndex] <= key)startIndex++;
//将找到的元素放到数组的后面 -------不用担心丢失数据 因为数组的最后一个元素已经被保存下来了就是上面@{key}
if(startIndex < endIndex){
arr[endIndex] = arr[startIndex];
endIndex--;
}
//然后从后向前找 因为之前将前面的元素移动到了后面 还要拿后面的元素来补齐前面
while (startIndex < endIndex && arr[endIndex] >= key)endIndex--;
if(startIndex < endIndex){
arr[startIndex] = arr[endIndex];
startIndex++;
}
}
arr[startIndex] = key;
System.out.println(Arrays.toString(arr));
//此处startIndex和endIndex一定是相等的 所以写哪个都可以 递归去重新排序key两边的数据
if(low < startIndex-1)partationSort(arr, low, startIndex - 1);
if(startIndex + 1 < high) partationSort(arr, startIndex + 1,high );
}
}