快速排序
快速排序:
以第一个元素为基准,将待排序的区间分成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
posted on 2014-09-21 21:45 xiaogua918 阅读(120) 评论(0) 编辑 收藏 举报