一、概念
快速排序是对冒泡排序的一种改进:记录的比较和移动是从两端向中间进行的,关键码较大的记录一次就能从前面移动到后面,关键码较小的记录一次就能从后面移动到前面,记录移动的距离较远,从而减少了总的比较次数和移动次数。
基本思想:首先选取一个轴值(povit,即比较的基准),将待排序记录划分为独立的两部分,左侧记录的关键码均小于或等于轴值,右侧记录的关键码均大于轴值,然后分别对两部分重复上述过程,直到整个序列有序,即简单的分而治之思想。
二、复杂度
排序方法 | 最差时间分析 | 最好时间分析 | 平均时间复杂度 | 空间复杂度 | 稳定性 |
快速排序 | O(n2) | O(nlog2n) | O(nlog2n) | O(log2n)-O(n) | 不稳定 |
三、代码实现
1 package sort; 2 3 public class QuickSort { 4 static int count = 1; 5 public static int partition(int[] array,int low, int high){ 6 //选取轴值 7 int key = array[low]; 8 while(low < high){ 9 //从后往前扫描 10 while(array[high] >= key && low < high){ 11 high--; 12 } 13 //此时key > array[high],需要移动到key的左边 14 array[low] = array[high]; 15 //从前往后扫描 16 while(array[low] <= key && low < high){ 17 low++; 18 } 19 array[high] = array[low]; 20 } 21 array[high] = key;//此时low == high 22 printArray(array,count++); 23 return high; 24 } 25 public void quicksort(int[] array, int low, int high){ 26 if(low >= high) 27 return; 28 int index = partition(array, low, high); 29 quicksort(array,low,index-1); 30 quicksort(array,index+1,high); 31 32 } 33 //打印每次排序的结果 34 public static void printArray(int a[],int count){ 35 if(count != 0) 36 System.out.print("第" + count + "次 "); 37 for(int m = 0; m < a.length; m++){ 38 System.out.print(a[m] + " "); 39 } 40 System.out.println(); 41 } 42 public static void main(String[] args) { 43 QuickSort ms = new QuickSort(); 44 int array[] = {7, 2, 8, 3, 1, 6, 9, 0, 5, 4}; 45 ms.quicksort(array, 0, array.length-1); 46 } 47 }