美文网首页
iOS_排序算法

iOS_排序算法

作者: Jey | 来源:发表于2018-11-30 15:37 被阅读7次
  1. 冒泡排序
    /**  冒泡排序的特点
     *   我们取出第一个数 和 第二个数 将最小的数 赋给第一个数 然后让第二个数与 第三个数比较 将最小的数 赋给 第二个数 然后依次类推
     *   第一轮下来我们就获取到了最大的数  第二轮就从第二个数开始 我们就获取到了第二个比较大的数 通过循环就可以实现 升序
     */
NSMutableArray * dataArr = [NSMutableArray arrayWithArray:@[@"11", @"5", @"89", @"354", @"40", @"23", @"98", @"31", @"103", @"19"]];
    countNum = 0;

    for(int i = 0 ; i < [dataArr count]; i++){
        
        for(int j = 0; j< [dataArr count]-1-i; j++){
            countNum ++ ;
            if([dataArr[j] integerValue] > [dataArr[j+1] integerValue]){
                
                NSString * temp = dataArr[j];
                dataArr[j] = dataArr[j+1];
                dataArr[j+1] = temp;
            }
        }
    }
    
    NSLog(@"%ld次-冒泡排序之后数组的顺序--%@", (long)countNum, dataArr);

结果:

2018-04-11 11:34:37.579219+0800 iOS_算法[1713:72029] 45次-冒泡排序之后数组的顺序--(
    5,
    11,
    19,
    23,
    31,
    40,
    89,
    98,
    103,
    354
)
  1. 选择排序
    /**   选择排序的特点
     *    我们取出第一个数 然后让它与剩下的数一一比较 那么一轮下来 我们就能确定最小值
     */
    NSMutableArray * selectArr = [NSMutableArray arrayWithArray:@[@"11", @"5", @"89", @"354", @"40", @"23", @"98", @"31", @"103", @"19"]];
    countNum = 0;
    for(int i = 0; i < selectArr.count-1; i ++){
        
        for(int j = i+1; j < selectArr.count; j ++){
            countNum ++ ;

            if([selectArr[i] integerValue] > [selectArr[j] integerValue]){
                
                NSString * temp = selectArr[i];
                selectArr[i] = selectArr[j];
                selectArr[j] = temp;
            }
        }
    }
    
    NSLog(@"%ld次_选择排序之后数组的顺序--%@", countNum,selectArr);

结果:

2018-04-11 11:34:37.579467+0800 iOS_算法[1713:72029] 45次_选择排序之后数组的顺序--(
    5,
    11,
    19,
    23,
    31,
    40,
    89,
    98,
    103,
    354
)
  1. 插入排序
    /**   插入排序的特点
     *    第一步我们取出第二数 然后让 第二个数与第一个数比较 如果 第二个数< 第一个数  那么我们就将数组第二个数的位子换成第一个数的值 然后 j--
     */
    NSMutableArray * insertArr = [NSMutableArray arrayWithArray:@[@"11", @"5", @"89", @"354", @"40", @"23", @"98", @"31", @"103", @"19"]];
    countNum = 0;

    for(int i = 1; i < insertArr.count; i++){
        
        int j = i;
        
        NSString * temp = insertArr[i];
        countNum ++ ;

        while (j > 0 && [temp integerValue] < [insertArr[j-1] integerValue]) {
            
            [insertArr replaceObjectAtIndex:j withObject:insertArr[j-1]];
            j--;
        }
        
        [insertArr replaceObjectAtIndex:j withObject:temp];
    }
    
    NSLog(@"%ld次_插入排序最终结果---%@", countNum, insertArr);

结果:

2018-04-11 11:34:37.579625+0800 iOS_算法[1713:72029] 9次_插入排序最终结果---(
    5,
    11,
    19,
    23,
    31,
    40,
    89,
    98,
    103,
    354
)
  1. 希尔排序
    /**  希尔排序的特点
     *   类似于对半查找 但又不一样.
     */
    NSMutableArray * hillArr = [NSMutableArray arrayWithArray:@[@"11", @"5", @"89", @"354", @"40", @"23", @"98", @"31", @"103", @"19"]];
    countNum = 0;

    int gap = hillArr.count/2.0;
    
    while (gap>=1) {
        
        for(int i = gap ; i< hillArr.count; i++){
            countNum ++ ;

            NSString * temp  = hillArr[i];
            int j = i;
            while (j>gap && [temp integerValue] < [hillArr[j-gap] integerValue]) {
                
                [hillArr replaceObjectAtIndex:j withObject:hillArr[j-gap]];
                j-=gap;
            }
            [hillArr replaceObjectAtIndex:j withObject:temp];
        }
        gap = gap/2;
    }
    
    NSLog(@"%ld次_希尔排序最终结果---%@", countNum, insertArr);

结果:

2018-04-11 11:34:37.579936+0800 iOS_算法[1713:72029] 22次_希尔排序最终结果---(
    5,
    11,
    19,
    23,
    31,
    40,
    89,
    98,
    103,
    354
)
  1. 二分查找
    /**  二分查找的特点
     *   二分查找有一个特点那就是这个数组一定是排序好的
     */
    NSArray * erFenArr = @[ @"5", @"22", @"24", @"40", @"45", @"98"];
    NSLog(@"二分查找最终输出的值%ld",[self BinarySearch:erFenArr target:@"24"]);

- (NSInteger)BinarySearch:(NSArray *)array target:(id)key
{
    NSInteger left = 0;
    NSInteger right = [array count] - 1;
    NSInteger middle = [array count] / 2;
    
    while (right >= left) {
        
        middle = (right + left) / 2;
        if (array[middle] == key) {
            
            return middle;
        }
        
        if (array[middle] > key) {
            right = middle - 1;
        }
        
        else if (array[middle] < key) {
            
            left = middle + 1;
        }
    }
    return -1;
}

结果:

2018-04-11 12:06:12.266219+0800 iOS_算法[2212:95127] 二分查找最终输出的值1
  1. 快排
    /**  快排 这个也蛮重要的 面试的话有可能会问
     */
    NSMutableArray * kuaipaiArr = [NSMutableArray arrayWithArray:@[@"11", @"5", @"89", @"354", @"40", @"23", @"98", @"31", @"103", @"19"]];
    countNum = 0;

    [self TB_KuaipaiWithArr:kuaipaiArr low:0 hight:kuaipaiArr.count-1];
    
    NSLog(@"%ld次_快速排序最终结果---%@", countNum, kuaipaiArr);


- (void)TB_KuaipaiWithArr:(NSMutableArray *)kuaipaiarr low:(NSInteger)low hight:(NSInteger)hight{
    
    if(low >= hight) return;
    
    
    NSInteger i = low;
    NSInteger j = hight;
    NSString * temp = kuaipaiarr[low];
    
    while (i < j) {
        
        while (i<j &&[temp integerValue] <= [kuaipaiarr[j] integerValue]) {
            j--;
        }
        
        kuaipaiarr[i] = kuaipaiarr[j];
        
        while (i<j&& [temp integerValue] >= [kuaipaiarr[i] integerValue]) {
            i++;
        }
        countNum ++ ;

        kuaipaiarr[j] = kuaipaiarr[i];
    }
    
    kuaipaiarr[i] = temp;
    
    [self TB_KuaipaiWithArr:kuaipaiarr low:low hight:i-1];
    [self TB_KuaipaiWithArr:kuaipaiarr low:i+1 hight:hight];
}

结果:

2018-04-11 12:06:12.266351+0800 iOS_算法[2212:95127] 9次_快速排序最终结果---(
    5,
    11,
    19,
    23,
    31,
    40,
    89,
    98,
    103,
    354
)

相关文章

网友评论

      本文标题:iOS_排序算法

      本文链接:https://www.haomeiwen.com/subject/wruahftx.html