Scala氣泡排序解析

2021-07-03 18:16:16 字數 1757 閱讀 5100

遞迴形式的氣泡排序(一),原**鏈結:

def bubblesort[a <% ordered[a]](list: list[a]): list[a] =

sort(list, nil)}

示例list(1,3,2)

一、堆疊分析

函式堆疊呼叫:

1 sort(list(1,3,2),nil)

2 bubble(list(1,3,2),nil,nil)

3 bubble(3::2,1::nil,nil)

4 bubble(3::nil,2::1::nil,nil)

5 sort(2::1::nil,3::nil)//第一次冒泡結束,求出了最大值3::nil。也是第二次冒泡的開始

6 bubble(2::1::nil,nil,3::nil)

7 bubble(2::nil,1::nil,3::nil)

8 sort(1::nil,2::3::nil)

9 bubble(1::nil,nil,2::3::nil)

10 sort(nil,1::2::3::nil)

11 1::2::3::nil

二、氣泡排序的演算法在於兩次巢狀的遍歷

每次遍歷可以看做一次遞迴——求出數列中最大值,用處理過的數列結果拼合數列的最大值。

1.sort函式

第乙個引數為需要處理的列表

第二個引數為已處理過的列表

2.bubble函式

引數:第乙個引數為需要處理的列表

第二個引數為作為內部的遞迴使用,從堆疊中可以看出,在最後一次呼叫自身(第4,7,9行)的時候,返回了除去最大值以外的其他元素組成的列表

第三個引數,待拼合的列表

最後,退出自身的遞迴時,將as中的最大值拼合到bs的首部作為sort的已處理過的列表,將剩下的元素作為乙個列表,進行乙個冒泡處理。

三、遞迴實現

3.1對sort的理解

乙個簡單的理解在於:

組成遞迴的兩個函式包含冒泡演算法的【核心】:

1.sort函式能夠將第乙個引數的列表進行氣泡排序》並且拼接到第二個引數中。

2.bubble函式能夠找出第乙個引數中的最大值和剩下的元素。

兩個函式合作可以實現對乙個列表的排序:

該**中,bubble函式主動呼叫sort方法,把最大值拼合到sort函式的第二個引數(bs:list[a])中,然後只要將剩下的元素列表傳給sort函式的第乙個引數。

按照【核心】中對sort函式的描述,sort函式對第乙個引數進行排序,並拼接到第二引數中。所以,就完成了排序。

上面的描述是建立在bubble函式【核心】能夠實現的基礎上。

3.2對bubble查詢最大值遞迴行為的解釋

bubble函式不僅要表示最大值,還要表示剩下的元素。所以bubble函式在 查詢最大值 行為上的描述為:

1)先把bubble函式的第乙個引數分成《第乙個元素》,《第二個元素》,《剩下的元素》。

2)比較《第乙個元素》和《第二個元素》和中較大的乙個,把較小值和第二引數拼合為乙個列表,把較大值和《剩下的元素》拼合到一起。

3)繼續使用查詢到較小值和第二個引數拼合到一起。把較大值和《剩下的元素》拼合到一起。最後《剩下的元素》會有0個,這時候比較過程中較小的值在bubble的第二個引數中。之後先不管,總之,

bubble函式能夠找出最大值和剩下的元素。

這樣就說明,bubble函式滿足【核心】中宣告的條件,和3.1結合,能夠實現對乙個列表進行排序。

氣泡排序解析

listvs new list var result getlist vs 氣泡排序是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果它們的順序錯誤就把它們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。比較的總次數就是 9 1 9 2 9...

Scala快速排序演算法解析

一 源 def sort ls list int list int 二 演算法的核心 1 快速排序事先選取乙個元素作為用來比較的基準。比基準大的數放在右邊,比基準小的數放在左邊,一次分成大 小兩類。2 每一類又通過選取乙個基準再次進行大小的分類。直到左右兩邊沒有資料為止。三 遞迴的解釋 理解遞迴的關...

Scala歸併排序解析

一 源 def msort t xs list t lt t,t boolen list t val fst,snd xs splitat n merge msort fst lt msort snd lt 源 來自coursera scala函式式程式設計原理 其中,msort函式的第二個引數 l...