vlambda博客
学习文章列表

快速排序的C++实现

快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。

分治法在计算机科学中,是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如本次的快速排序,还有归并排序,傅里叶变换等等。

 

快速排序的基本思想是:

1.先从数列中取出一个数作为基准数。

2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。

3.再对左右区间重复第二步,直到各区间只有一个数。

 

下面先来看实例吧。

//以一个数组作为示例,取区间第一个数为基准数//快速排序用C++实现如下://快速排序
#include<iostream>
using namespace std;void quickSort(int a[],int,int);
int main(){ int array[] = {23,56,21,77,35,3,7,34,7,43,76,29,79},k; int len = sizeof(array) / sizeof(int); cout << "The unsorted array is:" << endl; for (k = 0;k < len; k++) cout << array[k] << ","; cout << endl; quickSort(array,0,len-1); cout << "The sorted arrayare is:" << endl; for (k = 0; k < len; k++) cout << array[k] << ","; cout << endl; system("pause"); return 0;}
void quickSort(int s[], int l, int r){ if (l< r) { int i = l, j = r, x = s[l]; while (i < j) { while(i < j && s[j]>= x) // 从右向左找第一个小于x的数 j--; if(i < j) s[i++] = s[j]; while(i < j && s[i]< x) // 从左向右找第一个大于等于x的数 i++; if(i < j) s[j--] = s[i]; } s[i] = x; quickSort(s, l, i - 1); // 递归调用 quickSort(s, i + 1, r); }}


运行结果:

最后,快排的时间复杂度

最坏情况下的时间复杂度: O(n2)

平均情况的时间复杂度: O(nlog2n)

最好的时间复杂度: O(nlog2n)

空间复杂度: O(log2n) - O(n)

稳定性:不稳定