排序演算法 OC實現

2021-07-15 15:08:07 字數 2620 閱讀 4429

交換類排序:氣泡排序、快速排序

插入類排序:直接插入排序、希爾排序

選擇類排序:簡單選擇排序、堆排序

時間複雜度:最好(有序情況下)o(n),平均(逆序情況下)o(n^2)

空間複雜度:o(1)

演算法思想:(從小到大,從前往後)

第乙個記錄和第二個記錄比較,如果第乙個大,則二者交換,否則不交換;然後第二個記錄和第三個記錄比較,如果第二大,則二者交換,否則不交換……

**:(這裡是建立了nsmutablearray的分類,下同)

#import "nsmutablearray+sort.h"

@implementation

nsmutablearray (sort)

/** 氣泡排序

* isasc yes 表示公升序(下同)

*/- (void)sortedarraywithbubleasc:(bool)isasc

}if (!flag)

}}/** 交換2個值 */

- (void)swapindex1:(nsinteger)index1 index2:(nsinteger)index2

@end

時間複雜度:最好(越接近無序,演算法越高效)o(n),最壞(越接近有序,演算法越低效)o(n^2),平均o(nlogn)

空間複雜度:o(logn)

**:

/** 快速排序 */

- (void)sortedarraywithquicklow:(nsinteger)low high:(nsinteger)high asc:(bool)isasc

while (i < j && ((self[i] < temp && isasc) || (self[i] > temp && !isasc))) ++i;

if(iself[j] = self[i]; --j;}

}self[i] = temp;

[self sortedarraywithquicklow:0 high:i-1 asc:isasc];

[self sortedarraywithquicklow:i+1 high:high asc:isasc];}}

時間複雜度:o(nlogn)(最好,最壞都是這個)

空間複雜度:o(1)

可以把堆看為一顆完全二叉樹,若父親結點大於孩子結點,則這樣的堆叫做大頂堆;若父親結點小於孩子結點的值,則這樣的堆叫做小頂堆。

/** 堆排序 */

- (void)sortedwithheap:(bool)isasc

for (nsinteger i = self

.count - 1; i>=1; --i)

}- (void)siftwithlow:(nsinteger)low high:(nsinteger)high asc:(bool)isasc

}

時間複雜度:o(n^2 )

空間複雜度:o(1)

思想:從頭至尾順序掃瞄序列,找出最小的乙個記錄,和第乙個記錄交換,接著從剩下的記錄中繼續這種選擇和交換,最終使序列有序。

/** 簡單選擇排序 */

- (void)sortedwithselect:(bool)isasc

}[self swapindex1:i index2:k];}}

時間複雜度: o(n^2)

空間複雜度:o(1)

穩定性:穩定

**:

/** 直接插入排序 */

- (void)sortedwithinsert:(bool)isasc

self[j+1] = temp;}}

時間複雜度:平均o(nlogn)

空間複雜度:o(1)

穩定性:不穩定

/** 希爾排序 */

- (void)sortedwithshellstep:(int)step asc:(bool)isasc

self[j+step] = temp;}}

時間複雜度:「快些以nlogn的速度歸隊」(快:快速排序,些:希爾排序,歸:歸併排序,隊:堆排序)

空間複雜度:快速排序為o(logn),其他的都是o(1)

穩定性:「心情不穩定快些選好友聊天」(快:快速排序,些:希爾排序,選:直接選擇排序,堆:堆排序)

完整的demo見:github位址

常用的演算法排序問題 OC

oc 中常用的一些排序 nsarray arr 1 2 5 3 6 9 5 nsmutablearray oldarr nsmutablearray arraywitharray arr nslog oldarr self bubblesort oldarr self selectionsort o...

排序演算法 選擇排序演算法實現

1 時間複雜度 o n 2 2 選擇排序主要操作是交換和比較 交換次數在0 n 1 總比較次數 n n 1 n 2 n 3 1 n n 1 2 因為交換需要的cpu時間 比較需要的cpu時間 當n比較少時,選擇比冒泡快,減少了不必要的交換,每次交換僅僅是最大值或者最小值與序列起始位置進行狡猾。3 演...

OC排序總結

一般排序 nsarray array1 nsarray arraywithobjects 11 2 13 19 21 7 nil nsarray array2 array1 sortedarrayusingselector selector comparenumber 如果要比較數字的話就要給nss...