基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,
其中一部分的所有数据都比另外一部分的所有数据都要
小,然后再按此方法对这两部分数据分别进行快速排序,
整个排序过程可以递归进行,以此达到整个数据变成有序序列。快速排序的最坏时间为O(n2),但就平均性能而言,它是基于关键字比较的内部排序算法中速度最快者,快速排序亦因此而得名。它的平均时间复杂度为O(nlgn)。
package SortTest;
import java.util.Scanner;
public class QuickSort {
/**
* 快速排序
*
* @param args
*/
static void QuickSort(int[] a) {
QSort(a, 0, a.length - 1);
}
private static void QSort(int[] a, int low, int hight) {
int pivot;
pivot = Partition(a, low, hight);//获取枢纽元素的下标,并将大于枢纽元素的元素放到枢纽元素右边,小于枢纽元素的放在枢纽元素左边。
if (low < hight) {//当low小于hight时,以pivot为分界线划分数组。
if(pivot>0)
QSort(a, low, pivot - 1);
if(pivot<a.length -2)
QSort(a, pivot + 1, hight);
}
}
private static int Partition(int[] a, int low, int hight) {
int key;
key = a[low];//取第一位为枢纽元素
while(low < hight) {
while (low < hight && a[hight] >= key) {//从右遍历如果a[hight] >= key,hight--,否则和a[low]交换数值
hight--;
}
swp(a, low, hight);
while (low < hight && a[low] <= key) {
low++;
}
swp(a, low, hight);
}
return low;
}
private static void swp(int[] a, int low, int hight) {
int temp;
temp = a[hight];
a[hight] = a[low];
a[low] = temp;
}
public static void main(String[] args) {
// 读入指定长度的数组
Scanner sca = new Scanner(System.in);
int count = sca.nextInt();
int[] a = new int[count];
for (int i = 0; i < count; i++) {
a[i] = sca.nextInt();
}
QuickSort(a);
// 打印排序后的数组
for (int j = 0; j < a.length; j++) {
System.out.print(a[j] + " ");
}
}
}