快速排序(Quick Sort):
- 快速排序是由冒泡排序改进得到的。在待排序的n个记录中任取一个记录(通常为第一个记录)作为枢轴(或支点),设其关键字为key。经过一趟排序后,把所有关键字小于key的记录交换到前面,把所有关键字大于key的记录交换到后面,结果将待排序记录分成两个子表,最后将枢轴放在分界处的位置。然后,分别对左右子表重复上面的过程,直到每个子表只有一个记录时,排序完成。
- 图解:
完成一趟快速排序,然后分别对关键值左边和右边的分别进行快排
第一趟:{27 38 13} 49 {76 97 65 49}
第二趟:{13} 27 {38} 49 {76 97 65 49}
第三趟:13 27 38 49 {49 65} 76 {97}
第四趟:13 27 38 49 49 {65} 76 97
- 代码示例:
#include<iostream>
using namespace std;
int find_key(int low, int high, int *array){
int key=array[low]; //保存枢轴值
while(high>low){
while(high>low && array[high]>=key)
--high;
array[low] = array[high]; //比枢轴值小交换
while(high>low && array[low]<=key)
++low;
array[high] = array[low]; //比枢轴值大交换
}
array[low] = key; //将枢轴值插入
return low;
}
void quick_sort(int low, int high, int *array){
int key_position;
if(high>low){
key_position = find_key(low, high, array);
quick_sort(low, key_position-1, array);
quick_sort(key_position+1, high, array);
}
}
int main(){
int data[] = {49,38,65,97,76,13,27,49};
quick_sort(0, 7, data);
for(int i=0; i<8; i++){
cout<<data[i]<<" ";
}
return 0;
}
Output:13 27 38 49 49 65 76 97
- 时间复杂度O(n*log2(n)):
1.算法从两头交替搜索,直到low与high重合,时间复杂度为O(n)
2.假设每次划分几乎将序列等分,设需要的划分次数为k,有:
2^k = n
则k=log2(n)
所以时间复杂度为O(n*log2(n))
- 空间复杂度( O(log2(n)-O(n) ):
每次递归需要一个数组存储数据,最好情况下,每次递归都将元素分割为两个长度相近的子表,此时数组最大的长度为log2(n),即递归树的深度,空间复杂度为O(log2(n))。最坏情况下,长度为n,空间复杂度为O(n)