图片摘自网络,来自哪里不很清楚!
看图:(基准数取arr【0】)
1.左右开始找比基准数小和基准数大的数,交换位置
2.相遇的时候基准数归位(基准放到中间位置)
3.左边都比基准数小,右边都比基准数大分割开来,递归分开的两边!)
import java.util.Random;
/**
* @program:
* @description: 快排
* @author: sw
* @create: 2020-06-15 10:06
**/
public class QStart {
public static void main(String[] args) {
Random random = new Random();
//int[] arr = {5,6,3,9,10,7,24};
//Arrays.toString(arr)
int[] arr = new int[1000000];
for (int i = 0; i < arr.length; i++) {
arr[i] = random.nextInt();
}
long startTime = System.currentTimeMillis();
myQStart(arr, 0, arr.length - 1);
long endTime = System.currentTimeMillis() - startTime;
System.out.println("一百万数据排序时间毫秒值 : " + endTime);
}
private static void myQStart(int[] arr, int left, int right) {
//退出条件一定要加
if (left > right) {
return;
}
int i, j, baseNum, swap;
//基准数取第一个索引数arr【0】,当必须要动态给的数据
baseNum = arr[left];
i = left;
j = right;
while (i != j) {
//从右边往左边找一个比基准数小的数
while (j > i && arr[j] >= baseNum) {
//找不到索引左移
j--;
}
//从左边往右边找一个比基准数大的数
while (j > i && arr[i] <= baseNum) {
//找不到索引右移
i++;
}
//找到后把两个数交换位置
//if (i < j) {
swap = arr[j];
arr[j] = arr[i];
arr[i] = swap;
//}
}
//基准数归位(当左边的索引和右边的相遇时)
arr[left] = arr[i];
arr[i] = baseNum;
//分为前后两段后,递归调用快排算法!这里注意left是动态变化的,第一个参数不能用0
myQStart(arr, left, i - 1);
myQStart(arr, j + 1, right);
}
}
运行时间: