《資料結構與演算法》之排序

2021-10-07 20:52:37 字數 2824 閱讀 2686

《資料結構與演算法》之鍊錶

《資料結構與演算法》之鏈棧

《資料結構與演算法》之佇列

《資料結構與演算法》之二分查詢

《資料結構與演算法》之二叉樹

如果你是一名程式設計師,或多或少你都了解過、聽說過排序。在專案中我們也會經常用到排序,排序非常重要,現在我在這裡分享一些經典的排序演算法。

先附上demo位址

/// 氣泡排序

/// - parameter array: 陣列

class func bubblesort

(array: inout array)}

if end

}}

時間複雜度分析

最好情況下,要排序的資料已經是有序的了,我們只需要進行一次冒泡操作,就可以結束了,所以最好情況時間複雜度是 o(n)。而最壞的情況是,要排序的資料剛好是倒序排列的,我們需要進行 n 次冒泡操作,所以最壞情況時間複雜度為 o(n

2n^2

n2)。平均時間複雜度也是 o(n

2n^2

n2)。

/// 插入排序

/// - parameter array: 陣列

class func insertionsort

(array: inout array

)else

j -=1

}//把基準值插入合適的位置

array[j+1]

= value;

}}

時間複雜度分析

如果要排序的資料已經是有序的,我們並不需要搬移任何資料。所以這種情況下,最好時間複雜度為 o(n)。如果陣列是倒序的,每次插入都相當於在陣列的第乙個位置插入新的資料,所以需要移動大量的資料,所以最壞情況時間複雜度為 o(n

2n^2

n2)。平均時間複雜度也是 o(n

2n^2

n2)。

/// 歸併排序

/// - parameters:

/// - array: 陣列

/// - startidx: 開始座標

/// - endidx: 結束座標

class func mergesort

(array: inout array

, startidx: int, endidx: int)

let mididx =

(startidx + endidx)/2

self

.mergesort

(array:

&array, startidx: startidx, endidx: mididx)

self

.mergesort

(array:

&array, startidx: mididx +

1, endidx: endidx)

self

.merge

(array:

&array, startidx: startidx, mididx: mididx, endidx: endidx)

}/// 陣列排序

class func merge

(array: inout array

, startidx: int, mididx: int, endidx: int)

else

}while i <= mididx

while j <= endidx

// 將排序後的元素,全部都整合到陣列array中

for(idx, value)

in temparray.

enumerated()

}

歸併排序時間複雜度為o(nlogn),歸併排序不是原地排序演算法,需要借助額外的儲存空間。空間複雜度為o(n)。

/// 快排

/// - parameters:

/// - array: 陣列

/// - leftidx: 左下標

/// - rightidx: 右下標

class func quicksore

(array: inout array

, leftidx: int, rightidx: int)

var i = leftidx

var j = rightidx

//記錄比較基準數

let value = array[leftidx]

while i < j

//將查詢到的小值調換到i的位置

array[i]

= array[j]

//當在右邊查詢到乙個比基準數小的值時,就從i開始往後找比基準數大的值

while i < j && array[i]

<= value

//將查詢到的大值調換到j的位置

array[j]

= array[i]

}//將基準數放到正確位置

array[i]

= value

/**** 遞迴排序 ***/

//排序基準數左邊的

self

.quicksore

(array:

&array, leftidx: leftidx, rightidx: i -1)

//排序基準數右邊的

self

.quicksore

(array:

&array, leftidx: i +

1, rightidx: rightidx)

}

大部分情況下的時間複雜度都可以做到 o(nlogn),只有在極端情況下,才會退化到 o(n

2n^2

n2)。

資料結構與演算法之排序

三 演算法效能 二 七種排序演算法 資料結構之線性表 資料結構之鍊錶 資料結構之串 資料結構之圖 資料結構之排序演算法 對n個資料執行某種操作,使其按照某種規則有序的排列,這樣的操作就是排序。內排序與外排序 按照排序過程中資料是否全放在記憶體中,可以分為內排序和外排序 交插選並 其中內排序又分為插入...

資料結構與演算法之排序演算法 氣泡排序

2016年10月18日15 34 24 by piaxiaohui 氣泡排序 是一種交換排序,它的基本思想是 兩兩比較相鄰記錄的關鍵字,如果反序則交換,直到沒有反序的記錄為止。氣泡排序的由來,就有些類似於水中的bubble,比較輕的bubble始終在水的底層,而較輕的bubble在水的上層 較輕的b...

資料結構與演算法 排序演算法之氣泡排序

氣泡排序 bubble sort 是一種電腦科學領域的較簡單的排序演算法。它重複地走訪過要排序的元素列,依次比較兩個相鄰的元素,如果順序 如從大到小 首字母從z到a 錯誤就把他們交換過來。走訪元素的工作是重複地進行直到沒有相鄰元素需要交換,也就是說該元素列已經排序完成。這個演算法的名字由來是因為越小...