用棧和隊列實現(xiàn)快速排序算法

首先進行一次分裂,然后將分解后的兩個子序列分別入棧(入隊),接著循環(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ù)會少一些。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容