以下所讲解的情况都是升序。
1、冒泡排序
比较相邻两个数据的大小,进而调整数据位置
比较趟数为array.cout - 1次。每次都会将最大的排列到尾部,也可以理解为先排列尾部
第一趟,把最大的数放到数组最后一个位置;
第二趟,把第二大的数放在数组倒数第二个位置;
以此类推 ...
- (void)maopao:(NSMutableArray *)array {
for (NSInteger i = 0 ; i < array.count-1; i++) {
for (NSInteger j = 0; j < array.count -1- 1; j++ ) {
if ([array[j] integerValue] > [array[j + 1] integerValue]) {
NSInteger temp = [array[j] integerValue];
array[j] = [NSString stringWithFormat:@"%@", array[j + 1]];
array[j + 1] = [NSString stringWithFormat:@"%ld", temp];
}
}
}
NSLog(@"========%@", array);
}
2、选择排序
第一趟,所有数据与第一个数据比较,如果后面的数据大,则交互,
第二趟,第二个数据后面的数据与第二个数据比较,如果后面的数据大,则交互,
第一趟比较完后,最小的放在数组第一个位置;
第二趟比较完后,第二小的放在数组第二个位置;
- (void)sort:(NSMutableArray *)array {
for (NSInteger i = 0 ; i < array.count - 1; i++) {
NSLog(@"=======%@", array);
for (NSInteger j = i + 1; j < array.count; j++) {
if ([array[i] integerValue] > [array[j] integerValue]) {
NSInteger tmp = [array[i] integerValue];
array[i] = [NSString stringWithFormat:@"%@", array[j]];
array[j] = [NSString stringWithFormat:@"%ld",tmp];
}
}
}
NSLog(@"=======%@", array);
}
3、二分查找
使用二分法,需要满足数组必须是有序
de条件,取数据中间位置的值midvalue与要查找的数据key进行比较,如果midvalue大于key,那么以midvalue为中心,将数组分为左右两个,在左部分数组继续使用中间值与key进行比较
- (NSInteger)sertIndex:(NSMutableArray *)array min:(NSInteger)min max:(NSInteger)max withKey:(NSString *)key {
NSInteger mid = (min + max) / 2;
if ([key integerValue] > [array[mid] integerValue]) {
return [self sertIndex:array min:mid + 1 max:max withKey:key];
} else if ([key integerValue] < [array[mid] integerValue]) {
return [self sertIndex:array min:min max:mid - 1 withKey:key];
} else {
return mid;
}
或者
- (NSInteger)sertIndex:(NSMutableArray *)array min:(NSInteger)min max:(NSInteger)max withKey:(NSString *)key {
while (min <= max) {
NSInteger mid = (min + max) / 2;
if ([key integerValue] > [array[mid] integerValue]) {
min = mid + 1;
} else if ([key integerValue] < [array[mid] integerValue]) {
max = mid - 1;
} else {
return mid;
}
}
return 0;
}
4、快速排序
快速排序也成挖坑、填坑排序
(1)一组数据,选择首个数据作为基数,i为从左到右的角标,j为从右到左的角标。
(2)从右向左筛选,如果当前j所在的数据大于基数,j--;如果找到比基数小的数据,挖出来填到第一个位置,此时i++。再从左向右筛选,如果当前i对应的数据比基数小,那么i++;如果找到比基数大的数据,将数据放到j所在的位置,j--。
以此类推
当i==j,为走完一趟。数组被分来两份,再次向上面一样比较。
举例说明,数组内部数据如下:
@"32", @"16", @"5",@"45", @"6", @"3", @"100", @"10"
第一次比较
开始排序前,基数为第一个数据32,i = 0,j=array.count-1=7;
(1),从右向左查找,10比32小,所以将10放在32所在的位置上,i++。此时数组顺序为
@"10", @"16", @"5",@"45", @"6", @"3", @"100", @"10"
(2)从左向右筛选,此时i=1,此时基数还是32.所以用16和32比较,16比32小,所以不用移动,此时i++;i=2,用5和32比较,5比32小,也不用移动,此时i++;i= 3,用45和32比较,45比32大,此时需要移动,将45挖出来,放到当前j的位置j--,所以此时数据顺序为
@"10", @"16", @"5",@"45", @"6", @"3", @"100", @"45"
此时i=3,j=6.此时i和j还不相等,继续重复上面的两步
(3)从右向左查找,100比32大,不用移动,j--,此时j=5,用3和32比较,3比32小,将3挖出,放到当前i所在的位置,i++。此时数组顺序为
@"10", @"16", @"5",@"3", @"6", @"3", @"100", @"45"
此时i=4,j=5.继续比较
(4)从左向右比较,6比32小,不用移动,i++;此时i=5,与j相等,此时将基数32,放到i==j的位置shang,即位置5上
,此时数组顺序如下
@"10", @"16", @"5",@"3", @"6", @"32", @"100", @"45"
第二趟比较
此时跳出循环,进行第二次比较,此时的基数为10.(基数永远为数据的第一个数据
),以32为中心,将数组分为两部分
数组1数据为
@"10", @"16", @"5",@"3", @"6",
数组2数据为
@"100", @"45"
两个数据再次按照上面的方法进行比较。
我们以数组1为例
此时基数为10,i=0,j=4
(1),从右向左查找,6比10小,所以将6放在10所在的位置上,i++。此时数组顺序为
@"6", @"16", @"5",@"3", @"6",
(2)从左向右筛选,此时i=1,此时基数还是10.所以用16和10比较,16比10大,此时需要移动,将16挖出来,放到当前j的位置,j--,所以此时数据顺序为
@"6", @"16", @"5",@"3", @"16",
此时i=1,j=3.此时i和j还不相等,继续重复上面的两步
(3)从右向左查找,3比10小,将3挖出,放到当前i所在的位置,i++。此时数组顺序为
@"6", @"3", @"5",@"3", @"16",
此时i=2,j=3.继续比较
(4)从左向右比较,5比10小,不用移动,i++;此时i=3,与j相等,此时将基数10,放到i==j的位置上,即位置3上
,此时数组顺序如下
@"6", @"3", @"5",@"10", @"16",
第三次比较
此时以10位中心,将数组分为两份
数据1
@"6", @"3", @"5"
数组2
@"16",
以数组1为例,继续比较
此时基数为6,i=0,j=2
(1),从右向左查找,5比6小,所以将5放在6所在的位置上,i++。此时数组顺序为
@"5", @"3", @"5"
(2)从左向右筛选,此时i=1,此时基数还是6.所以用3和6比,3比6小,不需要移动,i++;i=2,i和j相等,此时将基数6放在i==j的位置上,即位置2上,此时数据顺序为
@"5", @"3", @"6"
第四步比较
此时以10位中心,将数组分为两份
数据1
@"5", @"3"
数组2
@"6"
以数组1为例,继续比较
此时基数为5,i=0,j=1
(1),从右向左查找,3比5小,所以将3放在5所在的位置上,i++。此时数组顺序为
@"3", @"3"
(2)从左向右筛选,此时i=1,i和j相等,此时将基数5放在i==j的位置上,即位置1上,此时数据顺序为
@"3", @"5"
所以排序方法为
- (void)sort:(NSMutableArray *)array min:(NSInteger)min max:(NSInteger)max{
if (min < max) {
NSInteger i = min;
NSInteger j = max;
NSInteger x = [array[i] integerValue];
while (i < j) {
while (i < j ) {
NSInteger jvalue = [array[j] integerValue];
if (jvalue < x) {
array[i] = [NSString stringWithFormat:@"%ld", jvalue];
i++;
break;
} else {
j --;
}
}
while (i < j) {
NSInteger ivalue = [array[i] integerValue];
if (ivalue > x) {
array[j] = [NSString stringWithFormat:@"%ld", ivalue];
j--;
break;
} else {
i++;
}
}
}
if (i == j) {
array[i] = [NSString stringWithFormat:@"%ld", x];
}
[self sort:array min:min max:i-1];
[self sort:array min:i+1 max:max];
}
}