快排演算法(遞迴/非遞迴)

來源:互聯網
上載者:User

最近看了一篇文章,介紹遞迴轉非遞迴的方法,主要是通過stack的資料結構類比遞迴函式堆棧的層次調用(後進先出,最裡層-->最外層,層層彈出),排序演算法很多是通過遞迴來實現的,這裡照葫蘆畫瓢,實現一下非遞迴的快排演算法。

先附上快排的遞迴用法,用於對比



/* 快速排序:從數組中選出一個值flag,通過一輪比較,將比flag大的置於一側,比flag小的置於另一側,再依照此法,對這兩部分做同樣的比較 *//* 複雜度:最壞情況,每次選取flag為最大或最小元素,退化成線性比較,O(n^2)            最好情況,每次選取的flag為中間值時,類似平衡樹,每次都對半分,效能為O(nlogn) */void Test_Init::quickSort(std::vector<int>& sortArray, int begin, int end){if (begin >= end){return;}int i = begin;int j = end;int flag = sortArray[j];//標誌位,以flag為界限,大於flag置於右邊,小於flag的置於左邊while(i < j){while ((sortArray[i] <= flag) && ((i < j))){i++;}sortArray[j] = sortArray[i];while((sortArray[j] >= flag)&& (i < j)){j--;}sortArray[i] = sortArray[j]; }sortArray[i]=flag;/* 經過一輪比較,以flag為界限,分為左右兩邊,左邊比flag小,右邊比flag大然後遞迴進行下一輪比較 */quickSort(sortArray, begin, i - 1);quickSort(sortArray, i + 1, end);}




再看一下非遞迴的寫法

void Test_Init::quickSortNoRecursive(std::vector<int>& sortArray){struct SnapShot{int start;int end;};SnapShot shot;shot.start = 0;shot.end = sortArray.size() - 1;std::stack<SnapShot> shotStack;shotStack.push(shot);while(!shotStack.empty()){/* 每次彈出棧頂元素 */SnapShot cur = shotStack.top();shotStack.pop();if (cur.start >= cur.end){/* 僅有一個元素時,不必比較 */continue;}int i = cur.start;int j = cur.end;int flag = sortArray[j];while(i < j){while ((sortArray[i] <= flag) && ((i < j))){i++;}sortArray[j] = sortArray[i];while((sortArray[j] >= flag)&& (i < j)){j--;}sortArray[i] = sortArray[j]; }/* flag右側進棧 */sortArray[i]=flag;int tmp = cur.start;cur.start = j + 1;shotStack.push(cur);/* flag左側進棧,先出 */SnapShot next;next.end = j - 1;next.start = tmp;shotStack.push(next);}return;}






聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.