排序的相關演算法 快排2(非遞迴) 菜鳥學習日記

2021-08-17 01:47:14 字數 1244 閱讀 1604

問題

一、快排給資料時,如果遇到最壞的情況

這裡我們要對快排演算法進行分析

分析快排的時間效率,取決於進行了多少趟排序,也就是我們遞迴的深度

這裡我們分析最好與最壞的情況

我們分別都來畫圖示意一下

1、快排最好的情況–每趟又能將所排的序列一分為二,將表分成兩個大小相等的序列,類似於折半查詢,效率為o(nlogn)

這個例子還不是最理想的,但大致就是像這個例子一樣

2、快排的最壞情況–序列已經排好

第一趟進行n-1次比較,第二趟n-2 …

(n-1)+(n-2)+…+1=n2/2

所以快排的效率就是o(logn)

如果是像這樣的情況,第一次選key時,我們就要注意,不要選到9,所以我們寫了乙個函式,三數取中,避免我們選到當前待排序列的最大或最小

//三數取中(優化快排的最壞情況)

int getmidindex(int*a, int left, int right)

else

if (a[left]

else

}else //left>mid

else

if (a[left]>a[right])

else}}

問題

二、對於棧,害怕棧溢位的優化

對於小區間用插入排序

//對於遞迴版的再優化,少用棧幀

void quicksortbetter(int*a, int left, int right)

else

}

還有就是非遞迴的實現
//非遞迴實現快排--用棧

void quicksortnonr(int* a, int begin, int end)

//當棧裡還有數,說明還有待排列的區間

while (!s.empty())

if (div + 1

< right)

}//排列完成

}

快排的遞迴和非遞迴版本

1 算導版本 偽 2 前後依次覆蓋版本 include include include include includeusing namespace std 把陣列分為兩部分,軸pivot左邊的部分都小於軸右邊的部分 template int partition vector vec,int low...

排序演算法 一 快排演算法 遞迴(C C )

快速排序是對氣泡排序的改進,它使用分治法的思想,每次迴圈根據指定的基準數,將其他元素分別放置其左右 公升序排序,大的放右小的放左 第二次迴圈,以基準數為中心,分為左右兩部分,每部分再通過新的基準數排序 不做具體舉例說明,直接分析時間複雜度然後貼上 排序n個專案要比較o n log n 次比較 可惜的...

遞迴到非遞迴轉換 歸併排序與快排的非遞迴實現

在高階語言中,函式的引數傳遞是由棧來實現的,後呼叫的函式的引數在棧的上部,先呼叫的函式的引數在棧的下部,在實現遞迴函式時,每一次呼叫的引數等資訊都會儲存在棧中,這樣在資料比較在時會出現棧溢位的錯誤,而且反覆呼叫函式,會使效率變的較低,在 中對 萬個數排序,用遞迴的快排花了 而用非遞迴,需要 而我們可...