帶哨兵的氣泡排序 氣泡排序的優化以及快排過程及優化

2021-10-17 02:45:06 字數 1290 閱讀 1002

氣泡排序的優化:

1.加入哨兵。2.記住每一次交換的最後位置,該位置以後的為有序,不需要改變。

1、快速排序的基本思想:

快速排序使用分治的思想,通過一趟排序將待排序列分割成兩部分,其中一部分記錄的關鍵字均比另一部分記錄的關鍵字小。之後分別對這兩部分記錄繼續進行排序,以達到整個序列有序的目的。

2、快速排序的三個步驟:

(1)選擇基準:在待排序列中,按照某種方式挑出乙個元素,作為 "基準"(pivot)

(2)分割操作:以該基準在序列中的實際位置,把序列分成兩個子串行。此時,在基準左邊的元素都比該基準小,在基準右邊的元素都比基準大

(3)遞迴地對兩個序列進行快速排序,直到序列為空或者只有乙個元素。

3、選擇基準的方式

對於分治演算法,當每次劃分時,演算法若都能分成兩個等長的子串行時,那麼分治演算法效率會達到最大。也就是說,基準的選擇是很重要的。選擇基準的方式決定了兩個分割後兩個子串行的長度,進而對整個演算法的效率產生決定性影響。

最理想的方法是,選擇的基準恰好能把待排序序列分成兩個等長的子串行

我們介紹三種選擇基準的方法:1.固定位置。 2.隨機選取基準。3.三數取中。

快排的優化:

1.第一種方法就是當待排序序列的長度分割到一定大小後,使用插入排序。原因是因為對於很小和部分有序的陣列,快排不如插排好。當待排序序列的長度分割到一定大小後,繼續分割的效率比插入排序要差,所以此時我們可以使用插入排序而不是快速排序。

2.第二種優化方法就是在一次分割結束後,可以把與樞紐key相等的元素聚在一起,繼續下次分割時,不再對與key相等元素分割。在處理過程中,會有兩個步驟:

第一步是在劃分的過程中,把與key相等的元素放入陣列的兩端。。。。。。第二步是在劃分結束後,把與key相等的元素移到移到樞軸(基準數)周圍。

3.還有一種就是三數取中也就是中軸數的選取,因為最佳的劃分是將待排序的序列分成等長的子串行,最佳的狀態我們可以使用序列中間的值,也就是第n/2個數。可是,這很難算出來,並且會明顯減慢快速排序的速度。這種中值的估計是可以通過隨機選取三個元素並用它們的中值作為樞紐元而得到。但事實上,隨機性並沒有多大的幫助,所以一般的做法就是說使用左端、右端和中心位置上的三個元素的中值作為樞紐元。(使用三數中值分割法消除了預排序輸入的不好情形) 減少快排大約14%的比較次數

4.優化遞迴操作

快排函式在函式尾部有兩次遞迴操作,我們可以對其使用尾遞迴優化。。。。。優點:如果待排序的序列劃分極端不平衡,遞迴的深度將趨近於n,而棧的大小是很有限的,每次遞迴呼叫都會耗費一定的棧空間,函式的引數越多,每次遞迴耗費的空間也越多。優化後,可以縮減堆疊深度,由原來的o(n)縮減為logn。即如下low = provit+1

帶哨兵的氣泡排序 氣泡排序簡介

該樓層疑似違規已被系統摺疊 隱藏此樓檢視此樓 交換排序的基本思想是 兩兩比較待排序記錄的關鍵字,發現兩個記錄的次序相反時即進行交換,直到沒有反序的記錄為止。應用交換排序基本思想的主要排序方法有 氣泡排序和快速排序。氣泡排序 1 排序方法 將被排序的記錄陣列r 1.n 垂直排列,每個記錄r i 看作是...

C 氣泡排序 氣泡排序的優化

本文包含氣泡排序的三種實現方式 分別為氣泡排序初級版,公升級版,終級版 自己起的名字 使用時只要使用終極版就本以了,終級版為公升級版的優化版本 至於初極版和公升級版只是為了幫助理解 氣泡排序的時間複雜度為o n include include include include include incl...

氣泡排序以及氣泡排序的優化

很早接觸過氣泡排序法,但一直沒有真正的理解,只是為了記住而學習,今天又重新看了一下,其實氣泡排序法第一次排序會把最大的冒到最上面,第二次會把次大的泡冒到最大的後面,一次類推 另外在排序的次數上會逐漸減少。看 void bubble sort int a,int n 其實還可以優化一下,當發現沒有進行...