快速排序,核心思想是把一串数字通过随机取的一个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
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 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);
}
}