美文网首页
OC 排序汇总

OC 排序汇总

作者: FLY_8219 | 来源:发表于2018-03-27 15:55 被阅读0次

    冒泡排序(BubbleSort)的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面。即首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。重复以上过程,仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到最大数前的一对相邻数,将小数放前,大数放后,第二趟结束,在倒数第二个数中得到一个新的最大数。如此下去,直至最终完成排序。
    由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序。
    用二重循环实现,外循环变量设为i,内循环变量设为j。外循环重复9次,内循环依次重复9,8,...,1次。每次进行比较的两个元素都是与内循环j有关的,它们可以分别用a[j]和a[j+1]标识,i的值依次为1,2,...,9,对于每一个i, j的值依次为1,2,...10-i。

    -(NSMutableArray*)array_sort:(NSArray*)numarr
    {
        NSUInteger count=numarr.count;
        int a[count];
        //把数组里的元素一一取出转化为整型:
        for (int i =0; i <count; i ++)
        {
            a[i]=[[numarr objectAtIndex:i] intValue];
        }
        //接收数据的数组:
        NSMutableArray*newarray=[[NSMutableArray alloc]initWithCapacity:0];
        for (int j=0; j<count-1; j++)
        {
            //内层for循环:确保每执行一轮:把前count-1-j个元素中最大的一个放到最后面
            for (int i=0; i<count-1-j; i++)
            {
                if(a[i] > a[i + 1])
                {
                    int temp = a[i];
                    a[i] = a[i + 1];
                    a[i + 1] = temp;
                }
            }
        }
        //把排好序的数据重新放回数组里:
        for (int c =0; c <count; c ++)
        {
            NSString*numstr=[NSString stringWithFormat:@"%d",a[c]];
            [newarray addObject:numstr];
        }
        return newarray;
    }
    

    快速排序:每次选一个基准数,比基准数小的放左边,比基准数大的放右边。

     NSMutableArray *QuickSortArr = [[NSMutableArray alloc] initWithObjects:@"2",@"3",@"6",@"9",@"1",@"4",nil];
      [self quickSort:QuickSortArr LowQ:0 HightQ:5];
    
    //快速排序
    -(NSMutableArray *)quickSort:(NSMutableArray *)dataArr LowQ:(int)low HightQ:(int)hight
    {
        
        //1.首次调用传入要排序的数组,传入起始索引和最高索引,对齐比较。
        if(low<hight)
        {
            //如果起始索引小于最高索引,将 I = 起始索引 。 J = 最高索引。
            int i = low,j = hight;
            //创建一个(要比较内容的类型)的对象,将数组中的起始索引为要取出的对象。
            int vot = [[dataArr objectAtIndex:i] intValue];
            //while循环判断 起始索引 于 最高索引是否相等
            while (i!=j) {
                //如果 I(首次是起始索引) 不等于 J(首次是最高索引) 则 WHILE循环 判断I是否小于J于 将数组中取出的对象是否小于或等于从最高索引取出的对象,如果俩条件都满足则: J--;
                
                while (i<j && vot<= [[dataArr objectAtIndex:j]intValue]) j--;
                
                //打印 J 的值
                NSLog(@"j==================%d",j);
                
                //首次比较是 起始索引如果小于最高索引
                if(i<j)
                {
                    //讲数组里的 起始索引所在的对象 替换成 最高索引的对象
                    [dataArr replaceObjectAtIndex:i withObject:[dataArr objectAtIndex:j]];
                    //打印出替换后的起始索引对象
                    NSLog(@"i=======[dataArray objectAtIndex:%d]=====%@",i,[dataArr objectAtIndex:i]);
                    //并且起始索引下标I++
                    i++;
                }
                
                //首次比较起始索引是否小于最高索引 并且 数组里取出的起始下标的元素是否小于 起始下标的元素
                while
                    (i<j && [[dataArr objectAtIndex:i]intValue]<vot) {
                    //若小于则I++
                    i++;
                }
                //如果起始索引I 小于最高索引J
                if(i<j)
                {
                    // 数组将 最高索引取出的对象替换成 起始索引的对象
                    [dataArr replaceObjectAtIndex:j withObject:[dataArr objectAtIndex:i]];
                    //打印出 交换后的对象值
                    NSLog(@"j======[dataArray objectAtIndex:%d]=====%@",j,[dataArr objectAtIndex:j]);
                    j--;
                }
                
            }
            //将数组起始索引位置对象换成 I(起始索引) 赋值后的对象
            [dataArr replaceObjectAtIndex:i withObject:[NSString stringWithFormat:@"%d",vot]];
            
            NSLog(@"low:(%d)....high:(%d)....vot:(%d)...%@",low,hight,vot,dataArr);
            
            //递归调用 将换完的数组 和 (最低索引)为 最初的索引 还有 (最高索引)改变后的最高索引J-1.
            
            //两组比较  第一组: 最低索引依旧,最高索引 减一  。第二组: 最低索引为 最低索引+1 最高索引为 最高索引
            [self quickSort:dataArr LowQ:low HightQ:j-1];
            
            //递归调用,将换完的数组 和(最低索引) 变换后的I+1 还有(最高索引) 为原来刚进此方法的最高索引 。
            [self quickSort:dataArr LowQ:i+1 HightQ:hight];
            
        }
        NSLog(@"排序结果:%@",dataArr);
        return dataArr;
    }
    

    直接插入排序:插前面,依次根后面的数比较

    + (NSMutableArray *)directSortWithString:(NSString *)str {
        NSLog(@"正在进行直接插入排序,请稍等...");
        NSMutableArray *sortedArr = [[NSMutableArray alloc]init];
        NSArray *tempArr = [str componentsSeparatedByCharactersInSet:
                            [NSCharacterSet whitespaceCharacterSet]];
        for(NSString *word in tempArr)
        {
            if (![word isEqualToString:@""]) {
                int selectIndex = [self directSortSelectIndexWithSortedArr:sortedArr WithString:word];
                [sortedArr insertObject:word atIndex:selectIndex];
            }
        }
        return sortedArr;
    }
    #pragma mark 快速插入排序
    +(int)directSortSelectIndexWithSortedArr:(NSMutableArray *)arr WithString:(NSString *)str{
        float willSortNumber = [str floatValue];
        for (int i = 0; i < arr.count; i++) {
            if (willSortNumber < [arr[i] floatValue]) {
                return i;
            }
        }
        return arr.count;
    }
    

    二分插入排序:每次插中间。

    + (NSMutableArray *)dichotomySortWithString:(NSString *)str{
        NSMutableArray *sortedArr = [[NSMutableArray alloc]init];
        NSLog(@"正在进行二分法插入排序,请稍等...");
        NSArray *tempArr = [str componentsSeparatedByCharactersInSet:
                            [NSCharacterSet whitespaceCharacterSet]];
        for(NSString *word in tempArr)
        {
            if (![word isEqualToString:@""]) {
                int selectIndex = [self dichotomySelectIndexWithSortedArr:sortedArr WithString:word];
                [sortedArr insertObject:word atIndex:selectIndex];
            }
        }
        return sortedArr;
    }
    #pragma mark 二分法插入排序
    +(int)dichotomySelectIndexWithSortedArr:(NSMutableArray *)arr WithString:(NSString *)str{
        float willSortNumber = [str floatValue];
        int left = 0;
        int i = 0;
        int righr = arr.count;
        int middle = (righr + left) / 2;
    //    int middle2 = (righr -left)/2 +left
        while (righr > left)
        {   i ++;
            middle = (left + righr) / 2;
            (willSortNumber < [arr[middle] floatValue]) ? righr = middle : (left = middle + 1);
        }
        return left;
    }
    

    选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
    /*

     21,4,25,8
     
     1---4,21,25,8
     
     2---4,8,25,21
     
     3---4,8,21,25
     
     */
    
    NSMutableArray * dataArray = [[NSMutableArray alloc]initWithObjects:@"15",@"8", @"9", @"87", @"22",@"1",@"29",@"11",  nil];
        
        for (int i = 0; i < dataArray.count - 1; i ++)
        {
            // 声明一个min 假设是最小值的那个索引
            int min = i;
            
            // 将第min个值与其他值进行对比
            for (int j = i + 1; j < dataArray.count; j++)
            {
                // 如果min对应的值大于后面的 说明j索引对应的值较小 就把 j赋给min
                if ([[dataArray objectAtIndex:min] intValue]  > [[dataArray objectAtIndex:j] intValue] )
                {
                    min = j;
                    
                }
            }
            // 如果 m与i相同 就不用进行交换  不同的话就进行交换
            if (min != i)
            {
                [dataArray exchangeObjectAtIndex:min withObjectAtIndex:i];
            }
        }
        NSLog(@"==----%@",dataArray );
    

    相关文章

      网友评论

          本文标题:OC 排序汇总

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