快速排序 基於scala實現

2021-09-26 05:07:59 字數 1946 閱讀 6895

快速排序由於排序效率在同為o(n*logn)的幾種排序方法中效率較高,因此經常被採用,再加上快速排序思想----分治法也確實實用.

快速排序是c.r.a.hoare於2023年提出的一種劃分交換排序。它採用了一種分治的策略,通常稱其為分治法(divide-and-conquermethod)。

該方法的基本思想是:

1.先從數列中取出乙個數作為基準數。

2.分割槽過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。

3.再對左右區間重複第二步,直到各區間只有乙個數。

以乙個陣列作為示例:取陣列的第乙個元素作為基準值,i:起始索引,j:末尾索引.索引0

1234

5678

9元素值703

4490

6639

7969

9955

初始狀態:i = 0,j = 9, 陣列 a = a[i] =a[0]= 70.

從後往前開始遍歷,尋找乙個小於等於a的數,發現當j =9時符合條件,則將j=9對應的值–55賦值給

剛才的a[0],即a[0] = a[9],陣列變為:索引0

1234

5678

9元素值

553

4490

6639

7969

9955

那麼70跑到哪去了呢?其實就是乙個變數a儲存了它的值.

由於索引在左半部分,直接從i++開始:尋找乙個大於a的數,然後賦值給a[9],發現i=3滿足條件,

所以:a[9] = a[3] = 90 ,此時陣列變為:索引0

1234

5678

9元素值

553

449066

3979

6999

90

同理,再次重複上述過程,j–,尋找乙個小於等於a的數:a[7] = 69,將其賦值給a[3],此時陣列變為:索引0

1234

5678

9元素值

553

446966

3979

6999

90

其實就是完成了基本思想的第二個步驟:

分割槽過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。

由於從左邊開始:i++;從右邊開始j–,那麼最終有個臨界條件即i == j ,此時i=j = 7,將剛才儲存在a的基準值70賦值給a[7],這樣就完成了左半區間的數都小於等於基準值70,右半區間的所有值都大於基準值70,最後對左右半區間分別重複上述的工作.直到區間只有1個數為止.

總結如下:

i =l; j = r; 將基準數形成第乙個a[i]。

j–由後向前找比它小的數,找到後以此數填前乙個a[i]中。

i++由前向後找比它大的數,找到後也以此數填到前乙個a[j]中。

再重複執行2,3二步,直到i==j,將基準數填入a[i]中。

最後,分別對2個子區間重複1,2,3步驟,直到區間只有1個數為止.

package cn.demo

object quick_sort

//快速排序的實現

def quick_sort(list:list[int]):list[int] =

}}}

結果:

list(3, 39, 44, 55, 66, 69, 70, 79, 90, 99)

程序完成,退出碼 0

參考:

菜鳥教程

白話經典演算法系列之六 快速排序 快速搞定

堆排序 基於scala實現

堆排序 heapsort 是指利用堆這種資料結構所設計的一種排序演算法。堆積是乙個近似完全二叉樹的結構,並同時滿足堆積的性質 即子結點的鍵值或索引總是小於 或者大於 它的父節點。堆排序可以說是一種利用堆的概念來排序的選擇排序。分為兩種方法 大頂堆 每個節點的值都大於或等於其子節點的值,在堆排序演算法...

用scala實現快速排序

author 孤星魅影 乙個簡單的整型陣列快速排序 scala大部分符號都是左結合,只有 的連線符是右結合,a b c 相當於a b c 它會優先執行冒號右邊的表示式。def sortint arr array int array int 乙個完整的快速排序的方法 可以傳入任意型別的buffer對其...

快速排序 基於c 實現

快排的特點 最壞情況下,對n個數的排序所花的時間是o n 2 雖然這個結果比較差,但是快速排序卻是用於排序的最佳的實用選擇,因為它的平均效能相當好 期望的執行時間為o nlgn 且o nlgn 中的隱含因子比較小,另外,它還能夠就地排序 也就是不需要另外開闢乙個陣列空間來進行中間資料儲存 在虛存環境...