遞迴形式的氣泡排序(一),原**鏈結:
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...