排序算法原理
填坑思想以及分区思想:
1、拿到一个无序数组,首先确定基准数,一般拿第一个数作为基准数。把基准数拿出来比较,就有了个坑位,即坑位从基准数位置开始
2、然后从数组最右侧开始往左比较,找到第一个比基准数小的,此位置创造一个坑位,把比基准数小的这个数放到上一个坑位中,也就是基准数占的那个坑啦
3.接着从所填坑位开始往右比较,找到第一个比基准数大的,此位置创造一个坑位,并把数填到上一个空的坑位,就又多出来一个坑位啦
4.继续在所填坑位往左查找,看有没有比基准数小的没有经过填坑的,有的话继续上面操作,直到最后一个坑位左边比基准数小,右边比基准数大,最后一个坑位放入基准数
5.基准数所在位置索引为分区索引,分区左边都比基准数小,右边都比基准数大,再将分区进行递归排序。
啊~好抽象-_-|||直接上代码
public void quickSort(int[] arr, int start, int end) {
//判断起始索引小于尾索引
if(start < end) {
//获取分区索引
int index = getIndex(arr,start, end);
//左侧递归,所有数比基准数小
quickSort(arr, 0, index - 1);
//右侧递归,所有数比基准数大
quickSort(arr, index + 1, end);
}
}
//填坑思想具体实现
private int getIndex(int[] arr, int start, int end) {
int i = start;
int j = end;
//获取基准数
int x = arr[i];
while(i < j) {
//右侧思想,往左比较比基准数小的数进行填坑换位
//比基准数大的跳过
while(i < j && arr[j] > x) {
j--;
}
//比基准数小的换位
if(i < j) {
arr[i] = arr[j];
i++;
}
//左侧思想, 往右比较找比基准数大的换位
//比基准数小的跳过
while(i < j && arr[i] < x) {
i++;
}
//比基准数大的换位
if(i < j) {
arr[j] = arr[i];
j--;
}
}
//最后未填坑的填基准数
arr[i] = x;
//返回基准数所在位置索引
return i;
}
- 测试结果
public static void main(String[] args) {
int[] arr = {5, 7, 8, 1, 6};
quickSort(arr, 0, arr.length - 1);
for(int i : arr) {
System.out.println(i);
}
}
- 总结
快速排序相对冒泡排序比较难理解,萌新的我也花了很长时间才转过来,还是要多练习