NSStringCompareOptions comparisonOptions = NSCaseInsensitiveSearch | NSNumericSearch | NSWidthInsensitiveSearch | NSForcedOrderingSearch;
創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供眉山網(wǎng)站建設、眉山做網(wǎng)站、眉山網(wǎng)站設計、眉山網(wǎng)站制作等企業(yè)網(wǎng)站建設、網(wǎng)頁設計與制作、眉山企業(yè)網(wǎng)站模板建站服務,十多年眉山做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡服務。
NSComparator temSortFirst = ^(NSString *obj1, NSString *obj2){
//#warning 這里是處理比較邏輯。下面的把字符串分開。處理結(jié)果是:按分開后的結(jié)果比較。把分開前的字符串按比較結(jié)果排序
obj1 = [obj1 componentsSeparatedByString:@"/"].lastObject;
obj2 = [obj2 componentsSeparatedByString:@"/"].lastObject;
NSRange range = NSMakeRange(0, obj1.length);
// obj1在前,升序;obj2在前,降序
return [obj2 compare:obj1 options:comparisonOptions range:range];
};
NSArray *resultArrayFirst = [mutableArray sortedArrayUsingComparator:temSortFirst];
// NSLog(@"%@", resultArrayFirst);
#warning 再排序
NSComparator temSortSecond = ^(NSString *obj1, NSString *obj2) {
NSRange range = NSMakeRange(0, obj1.length);
obj1 = [obj1 componentsSeparatedByString:@"/"].lastObject;
obj2 = [obj2 componentsSeparatedByString:@"/"].lastObject;
obj1 = [[obj1 componentsSeparatedByString:@"."].firstObject componentsSeparatedByString:@"_"].firstObject;
obj2 = [[obj2 componentsSeparatedByString:@"."].firstObject componentsSeparatedByString:@"_"].firstObject;
if (obj1 == obj2) {
return [obj1 compare:obj2 options:comparisonOptions range:range];
} else {
return [obj2 compare:obj1 options:comparisonOptions range:range];
}
};
_resultArraySecond = (NSMutableArray *)[resultArrayFirst sortedArrayUsingComparator:temSortSecond];
// NSLog(@"%@", resultArraySecond);
/*
////測試合并成一處??結(jié)果無效。
// NSStringCompareOptions comparisonOptions = NSCaseInsensitiveSearch | NSNumericSearch | NSWidthInsensitiveSearch | NSForcedOrderingSearch;
// NSComparator temSort = ^(NSString *obj1, NSString *obj2) {
// NSRange range = NSMakeRange(0, obj1.length);
// obj1 = [obj1 componentsSeparatedByString:@"/"].lastObject;
// obj2 = [obj2 componentsSeparatedByString:@"/"].lastObject;
// obj1 = [[obj1 componentsSeparatedByString:@"."].firstObject componentsSeparatedByString:@"_"].firstObject;
// obj2 = [[obj2 componentsSeparatedByString:@"."].firstObject componentsSeparatedByString:@"_"].firstObject;;
//
// if (obj1 == obj2) {
// return [obj1 compare:obj2 options:comparisonOptions range:range];
// }
//// else if (obj3 obj4) {
//// return [obj2 compare:obj1 options:comparisonOptions range:range];
//// }
// else {
//
// return [obj2 compare:obj1 options:comparisonOptions range:range];
// }
// };
// NSArray *resultArray = [temDataArr sortedArrayUsingComparator:temSort];
// NSLog(@"%@", resultArray);
*/
時間復雜度: O(n2)
穩(wěn)定性:不穩(wěn)定
假設序列有 n個元素 , n1 ,根據(jù)算法步驟,第1輪需在n個元素中遍歷n次查找到最小的元素,第2輪需在剩余的(n-1)個元素中遍歷(n-1)次找到最小的元素,… 第n-1輪需在剩余的2個元素中找到最小的元素,第n輪剩余1個元素放在已排序元素的末尾。
函數(shù)表達式為:
f(n) = n+(n-1)+…+2+1
f(n) = (n+1)*n/2
f(n) = (n2+n)/2
用大O表示法,忽略常量、低階和常數(shù)系數(shù)。
時間復雜度為: O(n2)
終端打印結(jié)果:
網(wǎng)上搜了一下,很多都說得云里霧里的,下面舉個栗子????說明:
假設某學校積分入學剩余2個學位,A、B、C三位學生先后報名,積分分別為 [A(90), B(90), C(100)] ,積分從高到低排序,前兩名獲得入學資格,如果使用選擇排序:
第一輪排序會將 A 和 C 交換,變成 [C(100), B(90), A(90)] ,此時排序已完成;
A、B同積分,但原來A比B優(yōu)先報名的,本應優(yōu)先取得入學資格,排序后卻變成了B在A的前面,現(xiàn)實中必然是不公平的。
因此可以看出, 選擇排序 是 不穩(wěn)定 的。
RUNOOB.COM-1.2 選擇排序
數(shù)據(jù)排序方法
好的排序方法可以有效提高排序速度,提高排序效果。
在計算機領域主要使用數(shù)據(jù)排序方法根據(jù)占用內(nèi)存的方式不同分為2大類:內(nèi)部排序方法與外部排序方法。
內(nèi)部排序方法
若整個排序過程不需要訪問外存便能完成,則稱此類排序問題為內(nèi)部排序。
內(nèi)排序的方法有許多種,按所用策略不同,可歸納為五類:插入排序、選擇排序、交換排序、歸并排序和基數(shù)排序。
其中,插入排序主要包括直接插入排序和希爾排序兩種;選擇排序主要包括直接選擇排序和堆排序;交換排序主要包括氣(冒)泡排序和快速排序。
外部排序方法
外部排序基本上由兩個相互獨立的階段組成。首先,按可用內(nèi)存大小,將外存上含n個記錄的文件分成若干長度為k的子文件或段(segment),依次讀入內(nèi)存并利用有效的內(nèi)部排序方法對它們進行排序,并將排序后得到的有序子文件重新寫入外存。通常稱這些有序子文件為歸并段或順串;然后,對這些歸并段進行逐趟歸并,使歸并段(有序子文件)逐漸由小到大,直至得到整個有序文件為止。
IOS幾種簡單有效的數(shù)組排序方法
//第一種,利用數(shù)組的sortedArrayUsingComparator調(diào)用 NSComparator ,obj1和obj2指的數(shù)組中的對象
NSComparator cmptr = ^(id obj1, id obj2){
if ([obj1 integerValue] [obj2 integerValue]) {
return (NSComparisonResult)NSOrderedDescending;
}
if ([obj1 integerValue] [obj2 integerValue]) {
return (NSComparisonResult)NSOrderedAscending;
}
return (NSComparisonResult)NSOrderedSame;
};
NSArray *sortArray = [[NSArray alloc] initWithObjects:@"1",@"3",@"4",@"7",@"8",@"2",@"6",@"5",@"13",@"15",@"12",@"20",@"28",@"",nil];
//排序前
NSMutableString *outputBefore = [[NSMutableString alloc] init];
for(NSString *str in sortArray){
[outputBefore appendFormat:@"];
}
NSLog(@"排序前:%@",outputBefore);
[outputBefore release];
//第一種排序
NSArray *array = [sortArray sortedArrayUsingComparator:cmptr];
NSMutableString *outputAfter = [[NSMutableString alloc] init];
for(NSString *str in array){
[outputAfter appendFormat:@"];
}
NSLog(@"排序后:%@",outputAfter);
[outputAfter release];
第二種 排序方法 利用sortedArrayUsingFunction 調(diào)用 對應方法customSort,這個方法中的obj1和obj2分別是指數(shù)組中的對象。
NSInteger customSort(id obj1, id obj2,void* context){
if ([obj1 integerValue] [obj2 integerValue]) {
return (NSComparisonResult)NSOrderedDescending;
}
if ([obj1 integerValue] [obj2 integerValue]) {
return (NSComparisonResult)NSOrderedAscending;
}
return (NSComparisonResult)NSOrderedSame;
}
NSArray *sortArray = [[NSArray alloc] initWithObjects:@"1",@"3",@"4",@"7",@"8",@"2",@"6",@"5",@"13",@"15",@"12",@"20",@"28",@"",nil];
//排序前
NSMutableString *outputBefore = [[NSMutableString alloc] init];
for(NSString *str in sortArray){
[outputBefore appendFormat:@"];
}
NSLog(@"排序前:%@",outputBefore);
[outputBefore release];
NSArray *array = [sortArray sortedArrayUsingFunction:customSort context:nil];
NSMutableString *outputAfter = [[NSMutableString alloc] init];
for(NSString *str in array){
[outputAfter appendFormat:@"];
}
NSLog(@"排序后:%@",outputAfter);
[outputAfter release];
第三種 利用sortUsingDescriptors調(diào)用NSSortDescriptor
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"price" ascending:NO];//其中,price為數(shù)組中的對象的屬性,這個針對數(shù)組中存放對象比較更簡潔方便
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor count:1];
[_totalInfoArray sortUsingDescriptors:sortDescriptors];
[_airListView refreshTable:_totalInfoArray];
[sortDescriptor release];
[sortDescriptors release];
希爾排序(Shell Sort),一聽這名字就知道是一個叫希爾的外國人發(fā)明的排序。沒錯,他就是唐納德 希爾(Donald Shell),一位美國的計算機科學家,他于1959年發(fā)明的希爾排序算法。
對于希爾排序,比較正式的官方的解釋是這樣:
希爾排序也是插入排序的一種。既然是其中的一種,那么他們的區(qū)別是什么呢?插入排序在最壞的情況下,即整個數(shù)組是倒序的,此時時間復雜度達到了O(n 2 )。希爾排序在插入排序的基礎上增加一個叫 增量 的概念。那什么增量?插入排序只能與相鄰的元素進行比較,而希爾排序則是進行跳躍比較,而增量就是步長。比如增量為3時,下標為0的元素與下標為3的元素比較,3再與6比較,1與4比較,4再與7比較……想必你肯定做過一群人站成一排,按一二報數(shù),喊一的一隊,喊二的一隊,此時的增量就是2。所以你也可以理解為是按增量進行了分組,再對每一組進行插入排序。當使用一個增量對所有的分組排好序后,再去減少增量,重復之前步驟,直到增量為1,此時只有一個分組了,再對這一個分組進行插入排序,整個希爾排序就結(jié)束了(所以希爾排序也叫 縮小增量排序 ,但顯然沒有希爾排序好聽和高大上 斜眼笑)。
從增量的初始值選取,到逐漸變?yōu)?,將所有用過的增量組成一個序列,就是 增量序列 。而希爾排序的增量序列選擇直接影響它的時間復雜度(不要問我為什么,我也不知道)。最簡單的增量就是希爾鼓勵使用的希爾增量。增量初始值選擇為N/2(N為數(shù)組長度),然后每次將增量除以2,得到下一個增量。所以它的增量序列為{N/2, (N / 2)/2, ..., 1}。除了希爾增量還有 Hibbard 增量 、 Knuth增量 等等都是很復雜的數(shù)學公式,我怕你看了暈,就放在后面介紹吧?。ㄕf的好像自己看了不暈一樣)
那下面我們就以最簡單的希爾增量來進行希爾排序。
然后對比之前文章所寫的選擇排序和插入排序。
三個同樣的數(shù)組,分別使用選擇、插入、希爾進行排序比較時間。
數(shù)組長度1萬時打印結(jié)果為:
數(shù)組長度為兩萬時打印結(jié)果為:
差距是很明顯的。
希爾排序為 不穩(wěn)定性排序 。因為相同的元素可能在各自的插入排序中移動,所以它的穩(wěn)定性就被打破了??赡苡腥讼雴?,穩(wěn)定性是干嘛的???穩(wěn)定的意思是指 相同的元素在排序后的相對位置不變 。比如有兩個5 ,作為區(qū)分前面的叫5 1 ,后面的叫5 2 ,排序完成后5 1 還在5 2 的前面。那你可能會問,反正是一樣的,換了就換唄。但是在實際應用中被排序的對象會擁有不同的屬性,舉個栗子,公司在招聘時,想要年齡小的,所以對所有人進行了按年齡的排序。之后還想看成績分數(shù)高的。所以在按成績進行排序時就有可能出現(xiàn)成績一樣的,但他們的年齡不一樣,而你不能把成績相同但年齡大的排在小的前面。此時算法的穩(wěn)定性就有了意義。
使用希爾增量,在最壞的情況下時間復雜度仍為O(n 2 ),而使用hibbard增量在最壞的情況下卻為O(n 3/2 )。
如果覺得作者對哪里的理解有偏差或者其他的優(yōu)化,希望不吝賜教,留言指正。謝謝支持~
冒泡排序是相鄰數(shù)據(jù)進行兩兩比較,假設升序排序,則一趟排序下來,就會有一個最大數(shù)產(chǎn)生在數(shù)組最末端。因為有 n 個數(shù)據(jù)需要進行比較,而每一趟排序需要遍歷n個數(shù)據(jù),所以時間復雜度為O(n^2)
快速排序是定下一個基準數(shù)(一般默認定義最左側(cè)數(shù)據(jù)為基準數(shù),可以理解為參照數(shù)),每一趟排序都需要從左(角標 i)右(角標 j)兩側(cè)開始像中間進行排序,因為基準數(shù)定義在左側(cè),一般先從右側(cè)開始向左側(cè)移動,j--;遇到小于基準數(shù)的暫停,左側(cè)開始向右移動,i++;遇到大于基準數(shù)的暫停;然后交換i 和 j 所對應的數(shù)據(jù)。當i和j相遇的時候,則將相遇值與基準數(shù)進行交換,一趟排序結(jié)束。時間復雜度是O(log2 n)