iOS---算法

以下所讲解的情况都是升序。
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];
         
    }

}

你可能感兴趣的:(iOS---算法)