不能遗忘的数据结构中经典的排序算法

被遗忘的经典排序算法,以前是闭上眼睛都写出来,现在是不知道什么是快排了!岁月不仅是一把杀猪刀,还是一杯忘情水。

  1. //直接插入排序.每步将一个待排序的记录按其关键字的大小插到前面已经排序的序列中的适当位置,直到全部记录插入完毕为止。
  2. -(void)initDirectChaSort:(NSMutableArray *)array{
  3.     NSInteger j=0;
  4.     for (NSInteger i=0; i<[array count]-1; i++) {
  5.         if ([[array objectAtIndex:i] integerValue]>[[array objectAtIndex:i+1] integerValue]) {
  6.             NSNumber *temp = [array objectAtIndex:i+1];
  7.             for (j=i+1; j>0&&([[array objectAtIndex:j-1] integerValue]>[temp integerValue]); j--) {
  8.                 [array exchangeObjectAtIndex:j-1 withObjectAtIndex:j];
  9.             }
  10.         }
  11.     }
  12.     for (NSInteger i=0; icount; i++) {
  13.         NSLog(@"直接插入排序排序后的顺序为:%@",[array objectAtIndex:i]);
  14.     }
  15. }
  16. //简单选择排序 n^2
  17. -(void)initSelectedSort:(NSArray *)arry{
  18.     //选择数组中最小的数与待排序中的第一个数交换
  19.     NSMutableArray *array = [arry mutableCopy];
  20.     for (NSInteger i=0; icount; i++) {
  21.         NSInteger j=0;
  22.         while (jcount) {
  23.             if ([[array objectAtIndex:i] integerValue]<[[array objectAtIndex:j] integerValue]) {
  24.                 [array exchangeObjectAtIndex:i withObjectAtIndex:j];
  25.             }
  26.             j++;
  27.         }
  28.     }
  29.     for (NSInteger i=0; icount; i++) {
  30.         NSLog(@"选择排序后的顺序为:%@",[array objectAtIndex:i]);
  31.     }
  32. }
  33. //array是待调整的堆数组,i是待调整的数组元素的位置,nlength是数组的长度
  34. //本函数功能是:根据数组array构建大根堆
  35. -(void)HeapAdjust:(NSMutableArray *)array index:(NSInteger)i  nLength:(NSInteger)nLength{
  36.     int nChild;
  37.     for(;2*i+1
  38.     {
  39.         //子结点的位置=2*(父结点位置)+1
  40.         nChild=2*i+1;
  41.         //得到子结点中较大的结点
  42.         if(nChild1&&[array[nChild+1] integerValue]>[array[nChild] integerValue])++nChild;
  43.         //如果较大的子结点大于父结点那么把较大的子结点往上移动,替换它的父结点
  44.         if([array[i] integerValue]<[array[nChild] integerValue])
  45.         {
  46.             [array exchangeObjectAtIndex:i withObjectAtIndex:nChild];
  47.         }
  48.         else break//否则退出循环
  49.     }
  50. }
  51. -(void)HeapSort:(NSMutableArray *)array Count:(NSInteger)length{
  52.     int i;
  53.     //调整序列的前半部分元素,调整完之后第一个元素是序列的最大的元素
  54.     //length/2-1是最后一个非叶节点,此处"/"为整除
  55.     for(i=length/2-1;i>=0;--i)
  56.         [self HeapAdjust:array index:i nLength:length];
  57.     //从最后一个元素开始对序列进行调整,不断的缩小调整的范围直到第一个元素
  58.     for(i=length-1;i>0;--i)
  59.     {
  60.         //把第一个元素和当前的最后一个元素交换,
  61.         [array exchangeObjectAtIndex:0 withObjectAtIndex:i];
  62.         //不断缩小调整heap的范围,每一次调整完毕保证第一个元素是当前序列的最大值
  63.         [self HeapAdjust:array index:0 nLength:i];
  64.     }
  65. }
  66. //堆排序
  67. -(void)initDuiSort:(NSMutableArray *)arry{
  68.     [self HeapSort:arry Count:arry.count];
  69.     for(NSInteger i=0;icount;i++)
  70.     {
  71.         NSLog(@"堆排序后的顺序为:%@",[arry objectAtIndex:i]);
  72.     }
  73. }
  74. //冒泡排序  时间复杂度:n^2(n的平方)
  75. -(void)initBubbleSort:(NSArray *)arry{
  76.     //相邻的两个数做比较,如果后面的比前面的一个数小,交换位置
  77.     NSMutableArray *array = [arry mutableCopy];
  78.     for (NSInteger i=0; icount; i++) {
  79.         for (NSInteger j=0;(j+1)count&&j<(array.count-i); j++) {
  80.             if ([array[j] integerValue]>[array[j+1] integerValue]) {
  81.                 [array exchangeObjectAtIndex:j withObjectAtIndex:j+1];
  82.             }
  83.         }
  84.     }
  85.     for (NSInteger i=0; icount; i++) {
  86.         NSLog(@"冒泡排序后的顺序为:%@",[array objectAtIndex:i]);
  87.     }
  88. }
  89. //设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。
  90. //一趟快速排序的算法是:
  91. //1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
  92. //2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];
  93. //3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]和A[i]互换;
  94. //4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;
  95. //5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。快速排序时间复杂度下界为O(nlogn),最坏情况为O(n^2)
  96. -(void)quicksort:(NSMutableArray *)array Left:(NSInteger)left Right:(NSInteger)right{
  97.     if (left>right) {
  98.         return;
  99.     }
  100.     NSInteger i=left,j = right;
  101.     NSInteger key = [array[left] integerValue];
  102.     while (i
  103.         while((iintegerValue] >= key)) {
  104.             j--;
  105.         }
  106.         [array exchangeObjectAtIndex:i withObjectAtIndex:j];//找到第一个小于key的值A[j],将A[j]和A[i]互换;
  107.         while((iintegerValue]<=key)) {
  108.             i++;
  109.         }
  110.         [array exchangeObjectAtIndex:j withObjectAtIndex:i];
  111.     }
  112. //    [array replaceObjectAtIndex:i withObject:array[i]];
  113.     [self quicksort:array Left:left Right:i-1];
  114.     [self quicksort:array Left:i+1 Right:right];
  115. }
  116. //快速排序
  117. //一趟快速排序的算法是:
  118. //1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
  119. //2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];
  120. //3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]和A[i]互换;
  121. //4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;
  122. //5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。
  123. -(void)initQuicklySort:(NSArray *)arry{
  124.     NSMutableArray *dataArray = [arry mutableCopy];
  125.     [self quicksort:dataArray Left:0 Right:dataArray.count-1];
  126.     for (NSInteger i=0; icount; i++) {
  127.         NSLog(@"快速排序后的顺序为:%@",[dataArray objectAtIndex:i]);
  128.     }
  129. }
  130. 测试用例
  131.     NSArray *array = @[@4,@20,@30,@1,@3,@8,@9];
  132.     [self initBubbleSort:array];//冒泡排序
  133.     [self initSelectedSort:array];//选择排序
  134.     [self initQuicklySort:array];//快速排序
  135.     [self initDirectChaSort:[array mutableCopy]];//直接插入排序
  136.     [self initDuiSort:[array mutableCopy]];//堆排序

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: