快速排序是冒泡排序的升级,都属于交换排序类,即通过不断比较和移动交换来实现排序。冒泡排序的实现是两两比较相邻的关键字,然后交换反序的记录,而快速排序的实现增大了记录的比较和移动的距离,将关键字较大的记录从前面直接移动到后面,关键字较小的记录从后面移动到前面,从而减小了比较次数和移动交换次数。
首先,我们看一下冒泡排序的实现
1、冒泡排序
基本思想:两两比较相邻记录的关键字,如果反序就交换记录,直到没有反序记录为止。
实现代码为:
void BubbleSort(vector<int>* L)
{
int i,j;
for (i=0;i<L->size();i++){
for (j=L->size()-2;j>=i;j--){
if (L->at(j)>L->at(j+1)){
//若前者大于后者,则交换
int temp=L->at(j);
L->at(j)=L->at(j+1);
L->at(j+1)=temp;
}
}
}
}
冒泡排序需要比较(n-1)+…+3+2+1=n(n-1)/2次,故时间复杂度为O(n2 )。
2、快速排序(Quick Sort)
基本思想:通过一次排序将待排序记录分割成独立的两个部分,其中一部分记录的关键字均比另一部分记录的关键字小,则分别对这两部分继续进行排序,以达到整个序列有序的目的。
排序算法的核心:要找到一个关键字,使其左边的值都比它小,右边的值都比它大,这个关键字称为枢轴。
寻找枢轴的具体思路为:将顺序表中的第一个记录作为枢轴记录,从表的两端交替向中间扫描,将高端比枢轴小的记录交换到低端,将低端比枢轴大的记录交换到高端,最后返回枢轴的位置。
快速排序的代码为:
#include<iostream>
usin