Swift 排序演算法

2021-09-11 14:15:59 字數 3551 閱讀 7283

本文採用陣列實現。

排序演算法

時間複雜度

空間複雜度

是否穩定

直接插入排序

o(n^2)

o(1)

是希爾排序

o(nlogn)

o(1)

否氣泡排序

o(n^2)

o(1)

是選擇排序

o(n^2)

o(1)

否歸併排序

o(nlogn)

o(n)

是快速排序

o(nlogn)

o(logn)

否堆排序

o(nlogn)

o(1)是

思想:每次將無序區的第乙個記錄按關鍵字插入到有序區的合適位置,並將有序區的長度加1。

func insertsort(array: inout [int]) -> void 

for i in 0..<(array.count-1) while (j - 1 >= 0) && (array[j - 1] > temp) // 還需要移動

// 插入

array[j] = temp}}

}複製**

又稱作縮小增量排序,是對直接插入排序的改進。

思路:shell排序是相當於把乙個陣列中的所有元素分成幾部分來排序;先把幾個小部分的元素排序好,讓元素大概有個順序,最後再全面使用插入排序。一般最後一次排序都是和上面的直接插入排序一樣的。

/// 一趟希爾排序,增量為dk

func shellinsert(array: inout [int], dk: int) -> void while (j - dk >= 0) && (array[j - dk] > temp)// 還需要移動

// 插入

array[j] = temp}}

}/// 希爾排序

func shellsort(array: inout [int], dk: [int]) -> void

// 按增量序列d對陣列array作希爾排序

for dkitem in dk

}複製**

思路:它重複地走訪過要排序的元素列,依次比較兩個相鄰的元素,如果他們的順序(如從大到小、首字母從a到z)錯誤就把他們交換過來。走訪元素的工作是重複地進行直到沒有相鄰元素需要交換,也就是說該元素已經排序完成。

func bubblesort(array:inout [int]) -> void 

for i in 0..<(array.count - 1) }}

}複製**

思路:每一次從待排序的資料元素中選出最小(或最大)的乙個元素,存放在序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。以此類推,直到全部待排序的資料元素排完。 選擇排序是不穩定的排序方法。

func selectsort(array:inout [int]) -> void 

for i in 0..<(array.count - 1)

}if i != min

}}複製**

歸併是指將兩個或兩個以上的有序序列組合成乙個新的有序序列。歸併排序是指把無序的待排序序列遞迴分解成若干個長度大致相等的有序自序列,並把有序子串行合併為整體有序序列的過程。

思路:

/// 合併

func merge(array:inout [int], low:int, mid:int, high:int)else

}while indexa < mid

while indexb < high

var index = 0

for item in temparray

}/// 拆分最後合併

func mergesort(array:inout [int], low: int, high: int) -> void

if low + 1 < high

}// 測試用例

// var sortarray = [49, 38, 65, 97, 76, 13, 27, 49, 55, 04]

// mergesort(array: &sortarray, low: 0, high: sortarray.count)

複製**

對氣泡排序的改進,常簡稱為快排。

思想:首先從待排序列中選定乙個記錄,稱之為樞軸,通過關鍵字與樞軸的比較將待排序的序列劃分成位於樞軸前後的兩個自序列,其中樞軸之前的子串行的所有關鍵字都不大於樞軸,樞軸之後的子串行的所有關鍵字都不小於樞軸;此時樞軸已到位,再按同樣方法對這兩個子串行分別遞迴進行快速排序,最終使得整個序列有序。

// 進行一次劃分,並返回樞軸的最終位置

func partiton(array:inout [int], low: int, high: int) -> int

while (array[left] <= x) && (left < right)

if left < right

} while left < right

// 樞軸移到正確位置

if low != right

return left // 返回樞軸的最終位置

}func quicksort (array:inout [int], low: int, high: int) -> void

if low < high

}// 測試用例

// var sortarray = [49, 38, 65, 97, 76, 13, 27, 49, 55, 04]

// quicksort(array: &sortarray, low: 0, high: sortarray.count-1)

複製**

思路:首先將待排序列建成乙個大頂堆,使得堆頂結點最大;將堆頂結點與堆尾結點交換位置,堆長度減1(即最大記錄排序到位);然後調整剩餘結點為堆,得到次大值結點;重複這一過程,即可得到乙個公升序序列。

/// 堆排序

// 篩選堆

func

shiftdown

(array:inout array,i:int,length:int)

-> void

if(array[k] > temp) else

k = k*2 + 1

}array[i] = temp;// 將temp值放到最終的位置

}func

makeheap

(array:inout array)

-> void

}func

heapsort

(array:inout array)

-> void

// 構建大頂堆

makeheap(array: &array)

// 調整堆篩選 + 交換堆頂元素與末尾元素

for j in (1...(array.count-1)).reversed()

}複製**

排序演算法(Swift)

電腦科學中,演算法的時間複雜度是乙個函式,它定性描述了該演算法的執行時間。這是乙個關於代表演算法輸入值的字串的長度的函式。時間複雜度常用大o符號表述,不包括這個函式的低階項和首項係數。使用這種方式時,時間複雜度可被稱為是漸近的,它考察當輸入值大小趨近無窮時的情況。func bubblesort ar...

Swift 選擇排序演算法

每一次從待排序的資料元素中選出最小 或最大 的乙個元素,存放在序列的起始位置,直到全部待排序的資料元素排完。找到第一小 大 的元素,放在第乙個位置 找到從第二個元素到末尾的元素中第二下 大 的元素,放入第二個位置 以此類推 import foundation 選擇排序 var unsortedlis...

swift演算法之排序 (一)氣泡排序

1 概述 氣泡排序是一種簡單的演算法,是指重複遍歷需要排序的元素列,一次比較兩個相鄰的元素,如果他們的順序 如從大到小 首字母a z等 錯誤就把他們交換過來,遍歷的目的是重複的進行指導沒有相鄰元素需要交換 即該元素列已經排序完成。2 演算法原理 1 比較相鄰的元素,如果第乙個比第二個大,就交換他們兩...