排序學習 - 為了面對演算法面試(1)

weixin_33936401發表於2017-10-16

前言

不懂就要問不會就要查!排序程式碼我選擇用Swift演示(暫時覺得Swift真不適合寫排序?)
放在前面的基礎理論知識

先從簡單的開始:

  • 1.選擇排序:
    方法原理:
    • 對比陣列中前一個元素跟後一個元素的大小,如果後面的元素比前面的元素小則用一個變數k來記住他的位置,接著第二次比較,前面“後一個元素”現變成了“前一個元素”,繼續跟他的“後一個元素”進行比較如果後面的元素比他要小則用變數k記住它在陣列中的位置(下標),等到迴圈結束的時候,我們應該找到了最小的那個數的下標了,然後進行判斷,如果這個元素的下標不是第一個元素的下標,就讓第一個元素跟他交換一下值,這樣就找到整個陣列中最小的數了。然後找到陣列中第二小的數,讓他跟陣列中第二個元素交換一下值,以此類推。
程式碼實現:
//選擇排序:
func selectionSort(arr:inout [Int]) -> [Int]{
    for i in 0..<arr.count-1{
        for j in i+1..<arr.count{
            if arr[i] > arr[j] {
                let temp = arr[j]
                arr[j] = arr[i]
                arr[i] = temp
            }
        }
    }
    return arr
}
  • 2.氣泡排序:

    方法原理:
    • 氣泡排序演算法的運作如下:(從後往前)
      1.比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
      2.對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。
      3.針對所有的元素重複以上的步驟,除了最後一個。
      4.持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。
程式碼實現:
//氣泡排序
func bubbleSort(arr:inout [Int]) -> [Int]{
    for i in 0..<arr.count-1{
        for j in 0..<arr.count-1-i{
            if arr[j] > arr[j+1] {
                let temp = arr[j]
                arr[j] = arr[j+1]
                arr[j+1] = temp
            }
        }
    }
    return arr
}
  • 3插入排序:
    方法原理:
    • 每次處理就是將無序數列的第一個元素與有序數列的元素從後往前逐個進行比較,找出插入位置,將該元素插入到有序數列的合適位置中。
      假設在一個無序的陣列中,要將該陣列中的數按插入排序的方法從小到大排序。假設啊a[]={3,5,2,1,4};插入排序的思想就是比大小,滿足條件交換位置,一開始會像氣泡排序一樣,但會比冒泡多一步就是交換後(a[i]=a[i+1]後)原位置(a[i])會繼續和前面的數比較滿足條件交換,直到a[i+1]前面的陣列是有序的。比如在第二次比較後陣列變成a[]={2,3,5,1,4};
//插入排序
func insertionSorting(arr:inout [Int]) -> [Int]{
    for i in 1..<arr.count {
        var j = i-1
        while(j >= 0){
            if arr[j] > arr[j+1] {
                let temp = arr[j]
                arr[j] = arr[j+1]
                arr[j+1] = temp
                
            }else{
                //如果 j 這個元素比 j+1的小 那麼前面不用比了 都比 j+1的小
                break
            }
            j -= 1
        }
    }
    return arr
}

to be continue!

相關文章