快速排序:
以第一个元素为基准,将待排序的区间分成2个子区间。将小于等于基准的元素放在左区间,大于等于基准的元素放在基右区间。对于左右子区间,递归调用前面的操作。
如 5、7、7、1、3
设low指向5,high指向3,设置5为基准。从hign开始向左寻找第一个小于5的元素,所以选择3
将high所指向的3赋给low指向的5得到
3、7、7、1、3
从low开始向右寻找第一个大于5的元素,所以选择7。将low所指向的7赋给high所指向的3得到
3、7、7、1、7
再从high所指向的7开始,往左寻找第一个小于5的元素,所以选择1。将high所指向的1赋给low指向的7得到
3、1、7、1、7
从low开始向右寻找第一个大于5的元素,所以选择7。将low所指向的7赋给high所指向的1得到
3、1、7、7、7
再从hign开始向左寻找第一个小于5的元素时,high==low。区间划分结束。将基准值赋给high所指向的位置
3、1、5、7、7
此时5左边的区间元素都小于等于5,右边的元素都大于等于5。
对左右两区间重复上次操作,即可完成排序。
#include <iostream>
#include <string>
using namespace std;
int partition(int a[] , int low , int high){
int i = low ,j = high;
int jizhun = a[i] ; //定义基准
while(i<j){
while(i < j && a[j] >= jizhun){ //从high开始往左寻找第一个小于基准的数
j--;
}
a[i] = a[j]; //把第一个小于基准的数放在low所指的位置
while(i < j && a[i] <= jizhun){ //从low开始往右寻找第一个大于基准的数
i++;
}
a[j] = a[i]; //把第一个大于基准的数放在high所指的位置
}
a[i] = jizhun; //最后i==j , i所指的位置即基准的正确位置
return i;
}
void quickSort(int a[] , int low ,int high){
if(low < high){
int pos = partition(a , low , high); // 划分左右区间,并得到基准的正确位置pos
quickSort(a , low , pos-1); //对左区间进行划分
quickSort(a , pos+1 , high); //对右区间进行划分
}
}
int main()
{
int a[6]={9,8,7,6,5,4};
quickSort(a,0,5);
for(int i = 0 ; i < 6 ;i++){
cout<<a[i]<<endl;
}
}
平均时间复杂度:O(nlog2n)
最好时间复杂度:O(nlog2n)
最坏时间复杂度:O(n2)
是不稳定的排序,如5、7、7、1
排序后的结果为1、5、7、7