Go實現氣泡排序和快速排序

go_9發表於2019-03-27

冒泡和快速排序都屬於交換類排序,所謂交換排序是指藉助資料元素之間互相交換進行排序的方法。

氣泡排序法 氣泡排序法是一種最簡單的交換類排序方法,它是通過相鄰資料的交換逐步將線性表變成有序。

氣泡排序(BubbleSort)的基本概念是:依次比較相鄰的兩個數,將小數放在前面,大數放在後面。

即在第一趟:首先比較第 1 個和第 2 個數,將小數放前,大數放後。然後比較第 2 個數和第 3 個數,將小數放前,大數放後,如此繼續,直至比較最後兩個數,將小數放前,大數放後。至此第一趟結束,將最大的數放到了最後。

在第二趟:仍從第一對數開始比較(因為可能由於第 2 個數和第 3 個數的交換,使得第 1 個數不再小於第 2 個數),將小數放前,大數放後,一直比較到倒數第二個數(倒數第一的位置上已經是最大的),

第二趟結束,在倒數第二的位置上得到一個新的最大數(其實在整個數列中是第二大的數)。如此下去,重複以上過程,直至最終完成排序。

由於在排序過程中總是小數往前放,大數往後放,相當於氣泡往上升,所以稱作氣泡排序。

func BubbleSort(values []int) {
    for i := 0; i < len(values)-1; i++ {
        for j := 0; j < len(values)-i-1; j++ {
            if values[j] > values[j+1] { //如果想換成降序排列,把">"號換成"<"即可
                values[j], values[j+1] = values[j+1], values[j]
            }
        }
    }
}

快速排序法 快速排序(Quicksort)是對氣泡排序的一種改進。由 C. A. R. Hoare 在 1962 年提出。它的基本思想是:通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。

設要排序的陣列是 A[0]……A[N-1],首先任意選取一個資料(通常選用第一個資料)作為關鍵資料,然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面,這個過程稱為一趟快速排序。值得注意的是,快速排序不是一種穩定的排序演算法,也就是說,多個相同的值的相對位置也許會在演算法結束時產生變動。

一趟快速排序的演算法是: 1)設定兩個變數 i、j,排序開始的時候:i=0,j=N-1; 2)以第一個陣列元素作為關鍵資料,賦值給 key,即 key=A[0]; 3)從 j 開始向前搜尋,即由後開始向前搜尋(j -- ),找到第一個小於 key 的值 A[j],A[i] 與 A[j] 交換; 4)從 i 開始向後搜尋,即由前開始向後搜尋(i ++ ),找到第一個大於 key 的 A[i],A[i] 與 A[j] 交換; 5)重複第 3、4、5 步,直到 I=J; (3,4 步是在程式中沒找到時候 j=j-1,i=i+1,直至找到為止。找到並交換的時候 i, j 指標位置不變。另外當 i=j 這過程一定正好是 i+ 或 j-完成的最後令迴圈結束。)

func quickSort(values []int,left,right int){
    temp:=values[left]
    p:=left
    i,j:=left,right
    for i<=j{
        for j>=p && values[j]>=temp{
            j--
        }
        if j>=p{
            values[p]=values[j]
            p=j
        }

        for i<=p && values[i]<=temp{
            i++
        }
        if i<=p{
            values[p]=values[i]
            p=i
        }
    }
    values[p]=temp
    if p-left>1{
        quickSort(values,left,p-1)
    }
    if right-p>1{
        quickSort(values,p+1,right)
    }
}
更多原創文章乾貨分享,請關注公眾號
  • Go實現氣泡排序和快速排序
  • 加微信實戰群請加微信(註明:實戰群):gocnio

相關文章