Sort了解一下

冒泡排序

思路:相邻两两比较大小,前面比后面大就交换位置,每一轮循环能确定一个最大的数在数组后面

- (NSMutableArray *)bubblingSort: (NSArray *)inputArr {
    
    NSMutableArray *resultArr = [NSMutableArray arrayWithArray:inputArr];
    // 外层循环控制循环次数
    for (int i = 0; i < resultArr.count - 1; i++) {
        // 内层循环控制两两比较的次数
        for (int j = 0; j < resultArr.count - 1 - i; j++) {
            if ([resultArr[j] intValue] > [resultArr[j+1] intValue]) {
                [resultArr exchangeObjectAtIndex:j withObjectAtIndex:j+1];
            }
        }
    }
    return resultArr;
}

选择排序

思路:拿第一个依次跟数组中的数比较,小的就换位置到第一位,一轮下来能确定一个最小的数的位置

- (NSMutableArray *)selectSort:(NSArray *)inputArr {
 
    NSMutableArray *resultArr = [NSMutableArray arrayWithArray:inputArr];
    for (int i = 0; i < resultArr.count; i++) {
        for (int j = i+1; j < resultArr.count; j++) {
            if (resultArr[i] > resultArr[j]) {
                [resultArr exchangeObjectAtIndex:i withObjectAtIndex:j];
            }
        }
    }
    return  resultArr;
}

快速排序

思路:拿第一个作为比对值,从两边开始查找比比对值大的和小的,交换他们的位置,一轮确定一个位置

- (NSMutableArray *)quickSortArr:(NSMutableArray *)arr leftIndex:(NSInteger)leftIndex rightIndex:(NSInteger)rightIndex {
    
    if (leftIndex >= rightIndex) return arr;
    
    NSInteger i = leftIndex;
    NSInteger j = rightIndex;
    NSInteger key = [arr[i] integerValue];
    while (i < j) {
        
        // 从右边开始查找比比对值小的
        while (i < j && [arr[j] integerValue] >= key) {
            j--;
        }
        arr[i] = arr[j];
        // 从左边开始查找比比对值大的
        while (i < j && [arr[i] integerValue] <= key) {
            i++;
        }
        arr[j] = arr[i];
    }
    // i = j 一次排序结束,找到比对i值的位置
    arr[i] = @(key);
    [self quickSortArr:arr leftIndex:leftIndex rightIndex:i-1];
    [self quickSortArr:arr leftIndex:i+1 rightIndex:rightIndex];
    return arr;
}

二分查找

目的:在数组[1,2,3,4...n]中找出目标值并输出数组下标的位置

- (NSInteger)binarySearch:(NSArray *)sourceArr target:(NSInteger)target {
    
    NSInteger start = 0;
    NSInteger end = sourceArr.count - 1;
    NSInteger mid = 0;
    while (start + 1 < end) {
        mid = (start + end) / 2;
        if (target == [sourceArr[mid] integerValue]) {
            return mid;
        }else if (target > [sourceArr[mid] integerValue]) {
            start = mid;
        }else {
            end = mid;
        }
    }
    if (target == [sourceArr[start] integerValue]) {
        return start;
    }
    if (target == [sourceArr[end] integerValue]) {
        return end;
    }
    return -1;
}

你可能感兴趣的:(Sort了解一下)