IOS 中常用的排序算法
@implementation Sort // 冒泡排序 // 依次两两相比,大的挪后边 + (NSMutableArray *)bubbleSort:(NSArray *)array { NSMutableArray *marray = [NSMutableArray arrayWithArray:array]; for (int end = (int)marray.count - 1; end > 0 ; end--) { for (int begin = 0; begin < end; begin++) { if (marray[begin] < marray[begin+1]) { [marray exchangeObjectAtIndex:begin withObjectAtIndex:begin+1]; } } } return marray; } // 选择排序 // 从序列中找到最大的元素,然后和最末尾的元素交换 + (NSMutableArray *)selectionSort:(NSArray *)array { NSMutableArray *marray = [NSMutableArray arrayWithArray:array]; for (int end = (int)(marray.count)-1; end>0; end--) { NSInteger maxIndex = 0; for (int begin = 1; begin <= end; begin++) { if (marray[maxIndex] < marray[begin]) { maxIndex = begin; } } [marray exchangeObjectAtIndex:maxIndex withObjectAtIndex:end]; } return marray; } // 插入排序 // 每次选择排好序的后一个数据与前边排好序的每一个进行比较 + (NSMutableArray *)insterSort:(NSArray *)array { NSMutableArray *marray = [NSMutableArray arrayWithArray:array]; for (int begin = 1; begin <= marray.count; begin++) { int end = begin-1; while (end>0) { if ([marray[end] integerValue] < [marray[end-1] integerValue]) { [marray exchangeObjectAtIndex:end withObjectAtIndex:end-1]; } end--; } } return marray; } + (NSMutableArray *)quickSort:(NSArray *)array { NSMutableArray *marray = [NSMutableArray arrayWithArray:array]; return marray; } // 二叉堆排序 + (NSMutableArray *)heapSort:(NSArray *)array { NSMutableArray *marray = [NSMutableArray arrayWithArray:array]; int heapSize = (int)marray.count; // 原地建堆 for (int i = (heapSize >> 1) - 1; i >= 0; i--) { [Sort siftDown:i array:marray heapSize:heapSize]; } // 此时,第一个元素是最大的. while (heapSize > 1) { // 交换第0 个元素 和 最后一个元素 最大的元素去到末尾 [marray exchangeObjectAtIndex:0 withObjectAtIndex:--heapSize]; [Sort siftDown:0 array:marray heapSize:heapSize]; } return marray; } // 下虑 恢复二叉堆的性质 (这里用的是大顶堆) + (void)siftDown:(int)index array:(NSMutableArray *)array heapSize:(int)heapSize{ NSInteger element = [array[index] integerValue]; // 第一个叶子结点的索引 int half = heapSize >> 1; while (index < half){ // 默认先取左子节点 int childIndex = (index << 1) + 1; NSInteger child = [array[childIndex] integerValue]; // 右子节点 int rightIndex = childIndex+1; // 右边比较大 if ((NSInteger)array[rightIndex] - child > 0){ childIndex = rightIndex; child = (NSInteger)array[rightIndex]; } // 节点比左右节点都大,跳出循环 if ((element - child) >= 0 ) break; // 否则, 子节点上去 array[index] = @(child); // 记录要替换的位置 index = childIndex; } array[index] = @(element); } @end