iOS中的排序筆記

2021-07-02 22:25:00 字數 3544 閱讀 6872

nscomparator

nscomparator有4種列舉型別

nsordereddescending降序,但是用他可以實現公升序或者降序都沒問題。

nsorderedascending公升序,但是目前沒有使用出任何效果。。

nsorderedsame相同,等價於不改變吧?

nssortdescriptor

這個排序可以直接對物件進行排序。用起來也很方便。

nssortdescriptor

*sort = [[

nssortdescriptor

alloc

] initwithkey

:@"recommendtime"

ascending:no

]; nsmutablearray

*sorts = [[

nsmutablearray

alloc

] initwithobjects

:&sort

count:1

]; nsarray

*sortarray = [

_focuslist

sortedarrayusingdescriptors

:sorts];

recommendtime是乙個時間,ascending,是表示是公升序還是降序。

計算時間差的方法:

cfabsolutetime start =cfabsolutetimegetcurrent();cfabsolutetime end=cfabsolutetimegetcurrent();nslog(

@"time cost: %0.3f ms

", (end - start)*1000);

使用nscomparator排序

comparator的定義如下所示:

typedef nscomparisonresult (^nscomparator)(id obj1, id obj2); 

返回的結果為nscomparisonresult型別來表示兩個物件的順序。

對上述的無序array的物件id進行排序,**如下:

nsarray *sortedarray = [unsortedarray sortedarrayusingcomparator:^(id obj1,id

obj2)

{   nsinteger val1 = ((topic*)obj1).id;

nsinteger val2 = ((topic*)obj2).id;

//if (val1 else

使用nsdescriptor排序

sort descriptor可以很方便的對陣列進行多個key的排序。比如要對陣列的物件先做id排序,然後在對content進行排序的話,可以寫成:

nssortdescriptor *firstdescriptor = [[nssortdescriptor alloc] initwithkey:@"id"

ascending:yes]; nssortdescriptor *seconddescriptor = [[nssortdescriptor alloc] initwithkey:@"

content

"ascending:yes];nsarray *sortarray =[nsarray arraywithobjects:firstdescriptor,seconddescriptor,nil];nsarray*sortedarray = [unsortedarray sortedarrayusingdescriptors:sortarray];

使用函式排序

具體**實現方式如下:

nsinteger customsort(id obj1, id obj2,void*context)

if (val1 return

(nscomparisonresult)nsorderedsame;} sortedarray = [array sortedarrayusingfunction:customsort context:nil];

快速排序

快速排序我想大多數的人都聽過,由於排序效率在同為o(n*logn)的幾種排序方法中效率較高,因此我們也對比以一下快排的表現,下面是快排的**:

void quicksort(nsmutablearray *array, nsinteger first, nsinteger last, nscomparator comparator) 

quicksort(array, first, right, comparator); quicksort(array, left, last, comparator);}nsarray* sort(nsarray *unsorted, nscomparator comparator)sortedarray = sort(array, ^(id obj1, id

obj2) );

結果對比

iphone4:

2014-10-17

13:51:31.980 algorithm_test[9578:907] nscomparator sort time cost: 163

.708ms

2014-10-17

13:51:32.273 algorithm_test[9578:907] nssortdescriptor sort time cost: 291

.293ms

2014-10-17

13:51:32.559 algorithm_test[9578:907] function sort time cost: 281

.485ms

2014-10-17

13:51:36.582 algorithm_test[9578:907] quick sort time cost: 4013

.582ms

iphone5s:

2014-10-17

14:02:59.323 algorithm_test[2971:60b] nscomparator sort time cost: 19

.238ms

2014-10-17

14:02:59.348 algorithm_test[2971:60b] nssortdescriptor sort time cost: 24

.183ms

2014-10-17

14:02:59.380 algorithm_test[2971:60b] function sort time cost: 31

.967ms

2014-10-17

14:02:59.468 algorithm_test[2971:60b] quick sort time cost: 86.205ms

的優化還是挺好的,但是快排的表現卻不盡如人意,至於5s機器上,上述的排序時間都在幾十毫秒,幾乎可以忽略不計。因此建議在需要排序的時候採用系統自帶的方法,至於用哪個可以看情況自己選擇。

iOS學習筆記之字典排序

有時候拼接引數會用到字典傳過來的引數而且是要排序的,下面我們看看應該怎麼去做!nsdictionary params 這個引數字典中一共有4個key name hometown userid phone。我們該怎麼樣把這四個字串按公升序排列呢?首先我們定義乙個陣列,儲存字典中的所有key值 nsar...

iOS筆記 Swift中的Optional型別

在objective c中並沒有optional型別,只有nil,並且nil只能用於表示物件型別無值,並不能用於基礎型別 int,float 列舉和結構體,基礎型別需要返回類似nsnotfound的特殊值來表示無值,所以在swift中定義了optinal型別來表示各種型別的無值狀態,並規定了nil不...

iOS學習筆記 iOS演算法 四 之氣泡排序

氣泡排序法的基本思想 以公升序為例 含有n個元素的陣列原則上要進行n 1次排序。對於每一躺的排序,從第乙個數開始,依次比較前乙個數與後乙個數的大小。如果前乙個數比後乙個數大,則進行交換。這樣一輪過後,最大的數將會出現稱為最末位的陣列元素。第二輪則去掉最後乙個數,對前n 1個數再按照上面的步驟找出最大...