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(使用nscomparator排序@"time cost: %0.3f ms
", (end - start)*1000);
comparator的定義如下所示:
typedef nscomparisonresult (^nscomparator)(id obj1, id obj2);
返回的結果為nscomparisonresult型別來表示兩個物件的順序。
對上述的無序array的物件id進行排序,**如下:
nsarray *sortedarray = [unsortedarray sortedarrayusingcomparator:^(id obj1,id使用nsdescriptor排序obj2)
{ nsinteger val1 = ((topic*)obj1).id;
nsinteger val2 = ((topic*)obj2).id;
//if (val1 else
}
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:的優化還是挺好的,但是快排的表現卻不盡如人意,至於5s機器上,上述的排序時間都在幾十毫秒,幾乎可以忽略不計。因此建議在需要排序的時候採用系統自帶的方法,至於用哪個可以看情況自己選擇。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
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個數再按照上面的步驟找出最大...