快速排序,核心思想是把一串数字通过随机取的一个KEY划分为左边和右边的两部分,左边的都小于KEY右边的都大于KEY
1.递归函数需要三个值,一个是排序的数组,一个是起始值start,还有一个是你需要排序到的最后一个我们就叫end
2.第一次进入函数,start为0,end为数组长度-1,再拟定一个key为数组的第一个值,就是arr[start]
3.然后从右边开始一个一个和key经行比较,如果是比key大的,那么下标移动j–,数组排序不动
4.如果是比key小的,我们需要把arr[i]和arr[j]的位置互换,这样,比key小的值就去了左边,然后右边遍历先不动了
5.然后从左边开始一个一个和key经行比较,如果是比key小的,那么下标移动i++,数组排序不动
6.如果是比key大的,我们需要把arr[i]和arr[j]的位置互换,这样,比key小的值就去了右边,然后左边遍历先不动了
7.但是需要注意的是3456步在交换arr[i]和arr[j]的位置时需要设置i<j不然的话数组下标就会出现移多了,i和j都重叠了还在移动
8.这些步骤完了之后,我们再对函数进行递归调用
9.左侧调用参数为数组arr,start和i-1
10.右侧调用参数为数组arr,i+1和end
如下参考代码
package com.huawei.sort;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
-
@author Lpf.
-
@version 创建时间:2019年3月30日 下午8:57:59 快速排序
*/
public class FastSort {
public static void main(String[] args) {// 随机生成一个长度为30的list List<Integer> list = new ArrayList<>(); for (int i = 0; i < 30; i++) { list.add((int) (1 + Math.random() * (100))); } Integer[] arr = new Integer[list.size()]; arr = list.toArray(arr); System.out.println("原始数据" + Arrays.toString(arr)); fastSort(arr, 0, arr.length - 1); System.out.println("排序后的" + Arrays.toString(arr));
}
/**
- 递归调用的方法
- @param arr
-
排序的数组
- @param start
-
当前的数组第一个值
- @param end
-
当前的数组最后一个值
*/
public static void fastSort(Integer[] arr, int start, int end) {if(start>=end) { return; } int i = start; int j = end; int key = arr[start]; while (i < j) { // 右边往左移动,符合条件的时候j--,当离开循环交换i和j的位置 while (arr[j] >= key && i < j) { j--; } if (i < j) { int temp = arr[j]; arr[j] = arr[i]; arr[i] = temp; } // 然后左边往右边移动 while (arr[i] <= key && i < j) { i++; } if (i < j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } // 递归左侧 fastSort(arr, start, i - 1); // 递归又侧 fastSort(arr, i + 1, end);
}
}