排序
冒泡排序
- 比較相鄰的元素。如果第一個(gè)比第二個(gè)大,就交換他們兩個(gè)。
- 對(duì)每一對(duì)相鄰元素做同樣的工作,從開始第一對(duì)到結(jié)尾的最后一對(duì)。在這一點(diǎn),最后的元素應(yīng)該會(huì)是最大的數(shù)。
- 針對(duì)所有的元素重復(fù)以上的步驟,除了最后一個(gè)。
- 持續(xù)每次對(duì)越來越少的元素重復(fù)上面的步驟,直到?jīng)]有任何一對(duì)數(shù)字需要比較。
/*
冒泡排序
1先是第一個(gè)數(shù)和第二個(gè)數(shù)進(jìn)行比較
1.1 如果第一個(gè)數(shù)小于第二個(gè)數(shù) ,則用第二個(gè)數(shù)與第三個(gè)數(shù)進(jìn)行比較
1.2 如果第一個(gè)數(shù)大于第二個(gè)數(shù),則進(jìn)行位置交換,接著用第二個(gè)數(shù)(原來的第一個(gè)數(shù))與第三個(gè)數(shù)進(jìn)行比較.....直到i-1和i進(jìn)行比較
1.3 這樣下來 一輪比較后,最大的數(shù)就會(huì)在最后
2 重復(fù)1步驟 但是不同的是, 第二輪比較,相對(duì)于第一輪比較,最后的比較是i-2和i-1進(jìn)行比較,原因 1.3
*/
- (void)maopao{
NSMutableArray *array = [NSMutableArray arrayWithObjects:@"17",@"28",@"15",@"16",@"24", nil];
for (NSUInteger i = 0; i < array.count-1; i++) {//0、1、2、3
for (NSInteger j = 0; j < array.count-1-i; j++) {//i=0 j=0、1、2、3 。i=1 j = 0、1、2。i=2 j = 0、1、。i=3 j = 0
NSString *obj = array[j];//17-28
NSString *obj1 = array[j+1];
NSLog(@"%ld=====%ld",i,j);
if (obj.integerValue > obj1.integerValue) {
NSInteger temp = [obj integerValue];
array[j] = array[j+1];
array[j+1] = [NSString stringWithFormat:@"%ld",temp];
}
}
NSLog(@"%@",array);
}
}
選擇排序
選擇排序的基本思想是,基于直接選擇排序和堆排序這兩種基本的簡(jiǎn)單排序方法。首先從第1個(gè)位置開始對(duì)全部元素進(jìn)行選擇,選出全部元素中最小的給該位置,再對(duì)第2個(gè)位置進(jìn)行選擇,在剩余元素中選擇最小的給該位置即可
/*
選擇排序
1先是第一個(gè)數(shù)A依次順序比較, 如果有數(shù)B小于它,就將A和B的位置對(duì)換。接著用對(duì)換后的數(shù)B繼續(xù)進(jìn)行比較
2再用第二個(gè)數(shù)進(jìn)行1操作
3用第三個(gè)數(shù)。。。。。第i個(gè)數(shù)
*/
- (void)xuanze{
NSMutableArray *array = [NSMutableArray arrayWithObjects:@"17",@"28",@"15",@"16",@"24", nil];
for (NSUInteger i = 0; i < array.count-1; i++) {//0、1、2、3
for (NSInteger j = i+1; j < array.count; j++) {//i=0 j=1234 。i=1 j =234。i=2 j = 23、。i=3 j = 3
NSString *obj = array[i];//17-28
NSString *obj1 = array[j];
NSLog(@"%ld=====%ld",i,j);
if (obj.integerValue > obj1.integerValue) {
NSInteger temp = [obj integerValue];
array[i] = array[j];
array[j] = [NSString stringWithFormat:@"%ld",temp];
}
}
NSLog(@"%@",array);
}
}
快速排序
1)設(shè)置兩個(gè)變量i、j,排序開始的時(shí)候:i=0,j=N-1;
2)以第一個(gè)數(shù)組元素作為關(guān)鍵數(shù)據(jù),賦值給key,即key=A[0];
3)從j開始向前搜索,即由后開始向前搜索(j--),找到第一個(gè)小于key的值A(chǔ)[j],將A[j]和A[i]的值交換;
4)從i開始向后搜索,即由前開始向后搜索(i++),找到第一個(gè)大于key的A[i],將A[i]和A[j]的值交換;
5)重復(fù)第3、4步,直到i=j; (3,4步中,沒找到符合條件的值,即3中A[j]不小于key,4中A[i]不大于key的時(shí)候改變j、i的值,使得j=j-1,i=i+1,直至找到為止。找到符合條件的值,進(jìn)行交換的時(shí)候i, j指針位置不變。另外,i==j這一過程一定正好是i+或j-完成的時(shí)候,此時(shí)令循環(huán)結(jié)束)。
假設(shè)一開始序列{xi}是:5,3,7,6,4,1,0,2,9,10,8。
此時(shí),ref=5,i=1,j=11,從后往前找,第一個(gè)比5小的數(shù)是x8=2,因此序列為:2,3,7,6,4,1,0,5,9,10,8。此時(shí)i=1,j=8,從前往后找,第一個(gè)比5大的數(shù)是x3=7,因此序列為:2,3,5,6,4,1,0,7,9,10,8。此時(shí),i=3,j=8,從第8位往前找,第一個(gè)比5小的數(shù)是x7=0,因此:2,3,0,6,4,1,5,7,9,10,8。此時(shí),i=3,j=7,從第3位往后找,第一個(gè)比5大的數(shù)是x4=6,因此:2,3,0,5,4,1,6,7,9,10,8。此時(shí),i=4,j=7,從第7位往前找,第一個(gè)比5小的數(shù)是x6=1,因此:2,3,0,1,4,5,6,7,9,10,8。此時(shí),i=4,j=6,從第4位往后找,直到第6位才有比5大的數(shù),這時(shí),i=j=6,ref成為一條分界線,它之前的數(shù)都比它小,之后的數(shù)都比它大,對(duì)于前后兩部分?jǐn)?shù),可以采用同樣的方法來排序 原文