package dataStructures.sort;
/*
* 快速排序是对冒泡排序的改进。基本思想是,通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另外一部分记录的关键字小,然后分别对这两部分记录继续进行排序,以达到整个序列有序。
*/
public class QuickSort {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] a = {49,38,65,97,76,13,27,9};
//int[] a = {13,9, 27, 38, 49, 65, 76,97};
sort(a,0,a.length-1);
printAllNum(a);
}
private static void sort(int[] a, int low, int high) {
//分割部分为一个元素时结束,即low=high时
if(low < high) {
int pos = partion(a, low, high);
sort(a, 0, pos-1);
sort(a, pos+1, high);
}
}
/*一趟排序,需要记录枢轴值(第一个的值)
* 首先从后往前查找比枢轴值小的值,然后从前往后查找比枢轴值大的值
*/
public static int partion(int[] a, int low, int high) {
//将记录分为两部分的中间值
int splitValue = a[low];
//空位
int pos = low;
while(low < high) {
while(low < high && splitValue <= a[high]) {
high--;
}
if(splitValue > a[high]) {
a[low] = a[high];
}
while(low < high && splitValue >= a[low]) {
low++;
}
if(splitValue < a[low]) {
a[high] = a[low];
}
}
a[low] = splitValue;
/*System.out.println("一趟排序后:");
printAllNum(a);*/
return low;
}
private static void printAllNum(int[] a) {
for(int i=0; i<a.length; i++) {
System.out.print(a[i] + " ");
}
System.out.println();
}
}
算法时间复杂度:平均为O(nlogn),最坏情况(基本有序)O(n2),
算法空间复杂度:O(logn),因为是递归,需要使用栈空间来实现。