首先進行一次分裂,然后將分解后的兩個子序列分別入棧(入隊),接著循環(huán)檢測棧(隊列)是否為空,不為空,繼續(xù)分裂,若為空,繼續(xù)循環(huán)??梢娺@里是棧還是隊列沒有關(guān)系。
代碼引用自快速排序的非遞歸實現(xiàn)
/**使用棧的非遞歸快速排序**/
template<typename Comparable>
void quicksort2(vector<Comparable> &vec,int low,int high){
stack<int> st;
if(low<high){
int mid=partition(vec,low,high);
if(low<mid-1){
st.push(low);
st.push(mid-1);
}
if(mid+1<high){
st.push(mid+1);
st.push(high);
}
//其實就是用棧保存每一個待排序子串的首尾元素下標(biāo),下一次while循環(huán)時取出這個范圍,對這段子序列進行partition操作
while(!st.empty()){
int q=st.top();
st.pop();
int p=st.top();
st.pop();
mid=partition(vec,p,q);
if(p<mid-1){
st.push(p);
st.push(mid-1);
}
if(mid+1<q){
st.push(mid+1);
st.push(q);
}
}
}
}
上訴引用文中關(guān)于冒泡和快速排序的說法也非常有意思。
首先說明一下快速排序是對冒泡排序的改進。為什么這么說呢?想一下冒泡排序,它把序列分成了兩部分,前半部分無序,后半部分升序排列,并且后半部分的數(shù)都大于前半部的數(shù)。
由此可得到快速排序和冒泡排序的一些共同點:
都要經(jīng)歷n趟排序
每趟排序要經(jīng)歷O(n)次比較
都是后半部分元素比前半部大
而不同之處就在于冒泡排序的交換操作發(fā)生相鄰的元素之間,即一趟排序可以要經(jīng)過多次交換操作;快速排序的交換操作發(fā)生在間隔比較遠(yuǎn)的兩個元素之間,一趟排序要經(jīng)過交換操作次數(shù)會少一些。