zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Android随笔使用ViewPager实现简单地图片的左右滑动切换
    简单地Android中图片的三级缓存机制
    Java中怎么遍历map中value值 (转载)
    创建可执行的jar包
    写出优秀的java代码(转载)
    [JS脚本]ajax status 错误定义
    jsonlib 之jsonConfig详细使用(转载写的不错)
    Driver not found Error when sonar server is just not running
    使用Maven生成manifest
    ECMAScript 面向对象技术
  • 原文地址:https://www.cnblogs.com/likun123/p/15476690.html
Copyright © 2011-2022 走看看