• 归并排序Merge Sort


     1 //C语言实现
     2 
     3 void mergeSort(int array[],int first, int last)
     4 {
     5     if (first < last)//拆分数列中元素只剩下两个的时候,不再拆分
     6     {
     7         int mid = (first + last) / 2;
     8         //递归拆分数组
     9         mergeSort(array, first, mid);
    10         mergeSort(array, mid + 1, last);
    11         //归并两个数组
    12         merge(array, first, mid, last);     
    13     }
    14 }
    15 
    16 void merge(int array[], int first,int mid,int last)
    17 {
    18     int i = first, j = mid + 1, k = first;
    19     int temp[last + 1];
    20     
    21     //从两个数列的第一个开始判断
    22     while (i <= mid && j <= last)
    23         if (array[i] <= array[j])
    24             temp[k ++] = array[i ++];
    25         else
    26             temp[k ++] = array[j ++];
    27     
    28     //如果有剩余,补充进入数组
    29     while (i <= mid)    
    30         temp[k ++] = array[i ++];
    31     while (j <= last)
    32         temp[k ++] = array[j ++];
    33     
    34     //复制数组
    35     while (first <= last)
    36     {
    37         array[first] = temp[first];
    38         first ++;
    39     }
    40 }
     1 //Objective-C实现
     2 //通过NSMutableArray的Category实现
     3 
     4 //.h文件
     5 @interface NSMutableArray (ArraySort)
     6 
     7 - (void)mergeSort;
     8 
     9 @end
    10 
    11 //.m文件
    12 
    13 #import "NSMutableArray+ArraySort.h"
    14 
    15 @implementation NSMutableArray (ArraySort)
    16 
    17 - (void)mergeSort
    18 {
    19     [self sortByStartIndex:0 endIndex:self.count - 1];
    20 }
    21 
    22 - (void)sortByStartIndex:(int)start endIndex:(int)end
    23 {
    24     if (start < end)
    25     {
    26         int mid = (start + end) / 2;
    27         [self sortByStartIndex:start endIndex:mid];
    28         [self sortByStartIndex:mid + 1 endIndex:end];
    29         [self mergeByStartIndex:start midIndex:mid endIndex:end];
    30     }
    31 }
    32 
    33 - (void)mergeByStartIndex:(int)start midIndex:(int)mid endIndex:(int)end
    34 {
    35     int i = start,j = mid + 1;
    36     NSMutableArray *tempArray = [[NSMutableArray alloc] initWithCapacity:end + 1];
    37     
    38     while (i <= mid && j <= end)
    39         if ([[self objectAtIndex:i] integerValue] <= [[self objectAtIndex:j] integerValue])
    40             [tempArray addObject:[self objectAtIndex:i ++]];
    41         else
    42             [tempArray addObject:[self objectAtIndex:j ++]];
    43     
    44     while (i <= mid)
    45         [tempArray addObject:[self objectAtIndex:i ++]];
    46     while (j <= end)
    47         [tempArray addObject:[self objectAtIndex:j ++]];
    48     
    49     for (id object in tempArray)
    50         [self replaceObjectAtIndex:start++ withObject:object];
    51 }
    52 
    53 @end
  • 相关阅读:
    居中方法
    12个css实用技巧
    display元素来布局
    伪元素::before与:after
    弹性布局
    输入框下拉菜单
    HTMLinput日期输入类型
    模块XXXX可能与您正在运行的Windows版本不兼容。检查该模块是否与regsvr32.exe的x86(32位)x64(64位)版本兼容。
    Epoll为我们带来了什么
    C内存管理相关内容--取自高质量C++&C编程指南
  • 原文地址:https://www.cnblogs.com/hellocby/p/3326735.html
Copyright © 2020-2023  润新知