快速排序是一个递归的过程,只要能够实现一趟快速排序的算法,就可以利用递归的方法对一趟快速排序后的左右分区域分别进行快速排序。会时常出现面试和笔试题目中。
值得强调是:最好的情况是枢纽元素选取得当,每次都能均匀的划分序列。 时间复杂度O(nlogn),最坏情况是枢纽元素为最大或者最小数字,那么所有数都划分到一个序列去了 时间复杂度为O(n^2)。
排序思路:
源码:
#include<iostream> using namespace std; template<class T> struct QuickSort { private: void swap(T &ra,T &rb) { T tmp; tmp = ra; ra = rb; rb = tmp; } void partition_dowhile(T *data,int len,int left,int right) // { if(data==nullptr||len<0||left<0||right>len) { cout<<"invalid parameter"<<endl; return; } int i_small = left; int i_big = right+1; if(i_small<i_big) { do { do //从左开始扫描 { i_small++; }while(i_small<right&&data[i_small]<data[left]); do { i_big--; }while(i_big>left&&data[i_big]>data[left]);//从右边开始扫描 if(i_small<i_big) { swap(data[i_small],data[i_big]); //交换 } }while(i_small<i_big); swap(data[left],data[i_big]); //交换枢纽数据 print(data,len); partition_dowhile(data,len,left,i_big-1); partition_dowhile(data,len,i_big+1,right); } } void partition_while(T *data,int len,int left,int right) { if(data==nullptr||len<0||left<0||right>len) { cout<<"invalid parameter"<<endl; return; } int i_small=left+1; int i_big=right; if(i_small<=i_big) { while(i_small<i_big) //从左边开始扫描 { while(i_small<right&&data[i_small]<data[left]) { i_small++; } while(i_big>left&&data[i_big]>data[left])//从右边开始扫描找 { i_big--; } if(i_small<i_big) { swap(data[i_small],data[i_big]); } } swap(data[left],data[i_big]);//交换枢纽数据 print(data,len); partition_while(data,len,left,i_big-1); partition_while(data,len,i_big+1,right); } } void partition_for(T *data,int len,int left,int right) { if(data==nullptr||len<0||left<0||right>len) { cout<<"invalid parameter"<<endl; return; } int i_small=left; if(left<right) { for(int index=left+1;index<=right;index++) { if(data[index]<data[left]) { i_small++; if(i_small!=index) { swap(data[i_small],data[index]); } } } this->swap(data[i_small],data[left]); print(data,len); partition_for(data,len,i_small+1,right); partition_for(data,len,left,i_small-1); } } public: void sort(T *data,int len) { if(data==nullptr||len<0) { cout<<"invalid parameter"<<endl; return; } partition_dowhile(data,len,0,len-1); this->print(data,len); } void print(T *data,int len) { cout<<"排序结果:"; for(int i=0;i<len;i++) { cout<<" "<<data[i]; } cout<<endl; } }; void main() { int data[10]={5,4,9,6,1,3,7,2,8,10}; QuickSort<int> quicksort; quicksort.sort(data,10); cin.get(); }
原文地址:http://blog.csdn.net/huangshanchun/article/details/46543777