iOS - 排序算法

1.冒泡排序

NSMutableArray *arr_M = [NSMutableArray arrayWithObjects:@"32",@"23",@"11",@"22",@"3",@"232",@"23123",@"43",nil];
for (int i = 0; i < arr_M.count ; i++) {
    
      //遍历数组的每一个`索引`(不包括最后一个,因为比较的是j+1)
      for (int j = 0; j < arr_M.count -1 - i; j++) {
        
           //根据索引的`相邻两位`进行`比较`
           if ([arr_M[j] integerValue] < [arr_M[j+1] integerValue]) {
                [arr_M exchangeObjectAtIndex:j withObjectAtIndex:j+1];
           }
       }
   }

   NSLog(@"最终结果:%@",arr_M);

2.选择排序

NSMutableArray *arr_M = [NSMutableArray arrayWithObjects:@"32",@"23",@"11",@"22",@"3",@"232",@"23123",@"43",nil];   
  for (int i=0; i<arr_M.count ; i++) {
      for (int j=i+1; j<arr_M.count; j++) {
         if ([arr_M[i] integerValue]<[arr_M[j] integerValue]) { 
            [arr_M exchangeObjectAtIndex:i withObjectAtIndex:j]; 
         }
      }
 }
 NSLog(@"%@",arr_M);

3.桶排序

NSArray *list = [NSArray arrayWithObjects:@"8",@"3",@"5",@"2",@"5", nil];
NSInteger max = 8; //此地取最大值         
NSMutableArray *save = [NSMutableArray arrayWithCapacity:(max+1)]; //此地只需要大于最大值继续
for (NSInteger i = 0; i < (max+1); i++) { 
    save[i] = @(0); 
}

 for (NSInteger i = 0; i < list.count; i++) {
     NSInteger rl = ((NSString*)list[i]).integerValue; 
    NSInteger result = ((NSNumber *)save[rl]).integerValue;
     result += 1; 
    save[rl] = @(result);
 } 
NSLog(@"排序:"); 
for (NSInteger i = max; i >= 0; i--) { 
    NSInteger count = ((NSNumber *)save[i]).integerValue; 
    while (count > 0) { 
        NSLog(@"%ld", (long)i); 
        count —;
     } 
} 

4.插入排序

NSMutableArray *dataArr = [NSMutableArray arrayWithObjects:@1,@19,@2,@65,@876,@0,@63,@-1,@87,@100,@-5,@100, nil]; 
for (int i = 0; i < dataArr.count; i++) {
   for (int j = i; j > 0; j--) {
       if ([dataArr[j] intValue] < [dataArr[j - 1] intValue]) { 
          [dataArr exchangeObjectAtIndex:j withObjectAtIndex:j-1];
       }
   } 
} 
NSLog(@"直接插入排序结果----%@",dataArr);

5.希尔排序

NSMutableArray *dataArr = [NSMutableArray arrayWithObjects:@1,@19,@2,@65,@876,@0,@63,@-1,@87,@100,@-5,@100,@333, nil]; 
 int n = (int)dataArr.count; 
 for (int gap = n / 2; gap > 0; gap /= 2){ 
    for (int i = gap; i < n; i++){
       for (int j = i - gap; j >= 0 && [dataArr[j] intValue] > [dataArr[j + gap] intValue]; j -= gap){               
           [dataArr exchangeObjectAtIndex:j withObjectAtIndex:(j + gap)]; 
       } 
    }
 } 
NSLog(@"----%@", dataArr);

6.堆排序

NSMutableArray *dataArr = [NSMutableArray arrayWithObjects:@1,@19,@2,@65,@876,@0,@63,@-1,@87,@100,@-5,@100,@333, nil];           
/* 从最后一个非叶子节点开始 自下而上进行调整堆 */ 
for (NSInteger i=(dataArr.count/2-1); i >= 0; --i) { 
    dataArr = [self maxHeapAdjust:dataArr index:i length:dataArr.count] ; 
} 
NSInteger num = dataArr.count;
 /* 剩余的元素个数不为1时则继续调整,取出元素。取出的元素放在最后的一个节点。然后减小堆的元素的个数。所以大顶堆排序出来的是升序的。 */ 
while (num > 1) {
   [dataArr exchangeObjectAtIndex:0 withObjectAtIndex:num-1]; 
  dataArr=[self maxHeapAdjust:dataArr index:0 length:num-1]; 
  num--; 
}
 NSLog(@"堆排序-----%@",dataArr);

- (NSMutableArray*)maxHeapAdjust:(NSMutableArray *)array index:(NSInteger)index length:(NSInteger)length { 
    NSInteger leftChildIndex =index*2+1;//获取该节点的左子节点索引 
    NSInteger rightChildIndex=index*2+2;//获取该节点的右子节点索引 
    NSInteger maxValueIndex=index;//暂时把该索引当做最大值所对应的索引 
    // leftChildIndex < length 
    // 判断左子节点的值是否大于当前最大值 
    if (leftChildIndex < length && [array[leftChildIndex] integerValue] > [array[maxValueIndex] integerValue]) { 
        //把左子节点的索引作为最大值所对应的索引 
        maxValueIndex=leftChildIndex; 
    }
   // rightChildIndex < length 
  // 判断左子节点的值是否大于当前最大值 
  if (rightChildIndex < length && [array[rightChildIndex] integerValue] > [array[maxValueIndex] integerValue]) { 
      maxValueIndex=rightChildIndex;
   } 
  //如果该节点不是最大值所在的节点 则将其和最大值节点进行交换
   if (maxValueIndex != index) {
       [array exchangeObjectAtIndex:maxValueIndex withObjectAtIndex:index];
      //递归乡下调整,此时maxValueIndex索引所对应的值是 刚才的父节点。 
      array=[self maxHeapAdjust:array index:maxValueIndex length:length];
   } 
    return array;
 }

7.快速排序

NSMutableArray *dataArr = [NSMutableArray arrayWithObjects:@1,@19,@2,@65,@876,@0,@63,@-1,@87,@100,@-5,@100,@333, nil]; 
[self quickSortArray:dataArr withLeftIndex:0 andRightIndex:dataArr.count-1]; 
NSLog(@"快速排序%@",dataArr);

- (void)quickSortArray:(NSMutableArray *)array withLeftIndex:(NSInteger)leftIndex andRightIndex:(NSInteger)rightIndex { 
    if (leftIndex >= rightIndex) {//如果数组长度为0或1时返回 
        return ;
     }
   NSInteger i = leftIndex; 
   NSInteger j = rightIndex;
   //记录比较基准数
   NSInteger key = [array[i] integerValue]; 
   while (i < j) { 
      /**** 首先从右边j开始查找比基准数小的值 ***/ 
      while (i < j && [array[j] integerValue] >= key) {
          //如果比基准数大,继续查找
           j--;
       }
       //如果比基准数小,则将查找到的小值调换到i的位置 
      array[i] = array[j]; 
      /**** 当在右边查找到一个比基准数小的值时,就从i开始往后找比基准数大的值 ***/ 
      while (i < j && [array[i] integerValue] <= key) {
          //如果比基准数小,继续查找
         i++; 
      } 
      //如果比基准数大,则将查找到的大值调换到j的位置 
      array[j] = array[i]; 
  } 
    //将基准数放到正确位置 
    array[i] = @(key); 
    /**** 递归排序 ***/ 
    //排序基准数左边的
   [self quickSortArray:array withLeftIndex:leftIndex andRightIndex:i - 1]; 
   //排序基准数右边的 
   [self quickSortArray:array withLeftIndex:i + 1 andRightIndex:rightIndex]; 
 }

8.归并排序

 self.dataArr = [NSMutableArray arrayWithObjects:@1,@19,@2,@65,@876,@0,@63,@-1,@87,@100,@-5,@100,@333, nil];
 NSMutableArray *tempArray = [NSMutableArray array];
 //将数组中的每一个元素放入一个数组中
 for (NSNumber *number in self.dataArr) { 
    NSMutableArray *childArray = [NSMutableArray array]; 
    [childArray addObject:number]; 
    [tempArray addObject:childArray]; 
 }
 //对这个数组中的数组进行合并,直到合并完毕为止 
  while (tempArray.count != 1) { 
      NSUInteger i = 0; 
      while (i < tempArray.count - 1) {
         tempArray[i] = [self mergeArray:tempArray[i] secondArray:tempArray[i+1]];
         [tempArray removeObjectAtIndex:i+1]; 
          i += 1;
       } 
  } 
  DLog(@"%@",tempArray);

// 归并排序中的“并”--合并:将两个有序数组进行合并
// - parameter firstList: 第一个有序数组
// - parameter secondList: 第二个有序数组
 - (NSMutableArray *)mergeArray:(NSMutableArray *)firstArray secondArray:(NSMutableArray *)secondArray { 
    NSMutableArray *resultArray = [NSMutableArray array]; 
    NSUInteger firstIndex = 0;
    NSUInteger secondIndex = 0; 
    while (firstIndex < firstArray.count && secondIndex < secondArray.count) { 
          if ([firstArray[firstIndex] integerValue] < [secondArray[secondIndex] integerValue]) {           
              [resultArray addObject:firstArray[firstIndex]];
               firstIndex += 1; 
          }else { 
              [resultArray addObject:secondArray[secondIndex]]; 
              secondIndex += 1;
         } 
    } 
    while (firstIndex < firstArray.count) { 
        [resultArray addObject:firstArray[firstIndex]]; 
        firstIndex += 1; 
    } 
    while (secondIndex < secondArray.count) { 
        [resultArray addObject:secondArray[secondIndex]]; 
        secondIndex += 1; 
    }
     return resultArray; 
}

9.二分法

NSMutableArray *dataArr = [NSMutableArray arrayWithObjects:@1,@19,@2,@65,@876,@0,@63,@-1,@87,@100,@-5,@100,@333, nil]; 
 for (int i = 1; i < dataArr.count; i++) { 
    int left = 0;
    int right = i - 1;
    int mid; 
    int temp = [dataArr[i] intValue]; 
    if (temp < [dataArr[right] intValue]) { 
        while (left <= right) {
             mid = (left + right) / 2; 
             if ([dataArr[mid] intValue] < temp) { 
                left = mid + 1; 
             }else if ([dataArr[mid] intValue] > temp) { 
                right = mid - 1;
             }else { 
                left += 1;
             }
         } 
        for (int j = i; j > left; j--) {
           [dataArr exchangeObjectAtIndex:j-1 withObjectAtIndex:j];
        } 
        dataArr[left] = [NSNumber numberWithInt:temp];
     }
  } 
  NSLog(@"折半插入排序----%@", dataArr);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,193评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,306评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,130评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,110评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,118评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,085评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,007评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,844评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,283评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,508评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,395评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,985评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,630评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,797评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,653评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,553评论 2 352

推荐阅读更多精彩内容

  • (插入排序、选择排序、交换排序、归并排序、基数排序) 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序...
    文中客阅读 6,963评论 5 31
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 5,183评论 0 52
  • 概述:排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    每天刷两次牙阅读 3,730评论 0 15
  • 问:什么是阿尔法柔性链路? 答:1、可信数据上链,让物理世界在数字世界上映射。所有区块链落地项目,都必须要解决可信...
    瑞雪兆峰年阅读 870评论 0 0
  • 写作践行第17天,这是跟随老张践行的第十七天,信心满满的在路上。 谈到理财,其实我一点经验也没有。无非就是从小别人...
    辉高阅读 505评论 0 1