package com.example.ljia.Structure.Arr;
/**
* @ Author :SamLai
* @ Date :Created in 2019-04-28 13:54
* @ Description:快速排序
* 说明: Quick Sort也是一个O(nlogn)复杂度的算法
* 时间复杂度: O(nlogn)
* 可以在1秒之内轻松处理100万数量级的数据
*/
public class QuickArr {
public static void main(String[] args) {
int[] karr = new int[]{12, 2, 23, 9, 18, 34, 67, 90, 110, 8};
quickSort(karr);
Qprintln(karr);
int numCount = 100 * 10000;
int[] bArr = new int[numCount];
for (int k = 0, len = bArr.length; k < len; k++) {
bArr[k] = (int) (1 + Math.random() * (numCount - 1 + 1));
}
long s1 = System.currentTimeMillis();
quickSort(bArr);
long s2 = System.currentTimeMillis();
// quickSortPrintln(bArr);
System.out.println(numCount + " 快速排序时间 : " + (s2 - s1));
//百万的排序:120ms 非常的快
}
private static void quickSortPrintln(int[] bArr) {
for (int k = 0, len = bArr.length; k < len; k++) {
if (k % 100 == 0) {
System.out.println();
}
System.out.print(k + " ");
}
}
private static void Qprintln(int[] karr) {
for (int k : karr) {
System.out.print(k + " ");
}
}
private static void quickSort(int[] karr) {
int start = 0, end = karr.length;
//[0...n]区间
quickSort(karr, 0, end - 1);
}
/**
* 快排:默认找第一个数v 以v为中间的间隔的内容
* @param karr
* @param start
* @param end
*/
private static void quickSort(int[] karr, int start, int end) {
if (start > end) {
return;
}
//获取中间值的坐标内容
int min = getmid(karr, start, end);
quickSort(karr, start, min - 1);
quickSort(karr, min + 1, end);
}
// 返回p, 使得arr[l...p-1] < arr[p] ; arr[p+1...r] > arr[p]
private static int getmid(int[] karr, int start, int end) {
int v = karr[start];
int j = start;
for (int k = start + 1; k <= end; k++) {
// 5 7 2 6 [0,3] ===> 5 7 2 6 j=0
// 5 7 j=0
// 5 2 7 j=1
// 5 2 7 6 j=1
if (karr[k] < v) {
j++;
swap(karr, j, k);
}
}
//2 5 7 6
swap(karr, start, j);
return j;
}
/**
* 交换数
* @param karr
* @param j
* @param k
*/
private static void swap(int[] karr, int j, int k) {
int temp = karr[j];
karr[j] = karr[k];
karr[k] = temp;
}
}