快速排序基本思想:
通过一趟排序将待排序记录分割成独立的两个部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录进行继续排序,已达到整个序列的有序。
时间复杂度:
平均性能是所有排序中最好的,数量级是O(nlogn),最坏情况是O(n^2)
算法实现:
int Partition(int []array,int low,int high){
int partition = low;
int partitionKey = array[partition];
while (low < high){
while (low < high && partitionKey <= array[high]) --high;
array[low] = array[high];
while (low < high && partitionKey >= array[low]) ++low;
array[high] = array[low];
}
array[low] = partitionKey;
return low;
}
void quickSort(int []array,int begin,int end) {
if (begin < end) {
int point = Partition(array,begin,end);
quickSort(array,begin,point-1);
quickSort(array,point+1,end);
}
}
排序示例图:
eg:
int []array = {23,34,25,90,11,2,35,88,1023,6,0};
该数组经过一次Partition:
partitionKey = 23
第一次交换:
low:0 high:10
0、34、25、90、11、2、35、88、1023、6、0
第二次交换:
low:1 high:10
0、34、25、90、11、2、35、88、1023、6、34
第三次交换:
low:1 high:9
0、6、25、90、11、2、35、88、1023、6、34
第四次交换:
low:2 high:9
0、6、25、90、11、2、35、88、1023、25、34
第五次交换:
low:2 high:5
0、6、2、90、11、2、35、88、1023、25、34
第六次交换:
low:3 high:5
0、6、2、90、11、90、35、88、1023、25、34
第七次交换:
low:3 high:4
0、6、2、11、11、90、35、88、1023、25、34
第八次交换:
low:4 high:4
0、6、2、11、23、90、35、88、1023、25、34