zoukankan      html  css  js  c++  java
  • 复习排序算法

    一. 冒泡排序算法

    1.第一次排序时将序列[0 ~ n - 1]中从前往后进行两个相邻元素的比较,若前者较大则交换,比较n-1次;
    当第一趟排序结束时,序列最大的元素就被交换到位置n-1上,就如同一个气泡,一步一步往后翻滚,直到最后一位。

    2.重复步骤1,在第i趟时需要翻滚n-i-1次,每趟决定一个元素的位置,一共需要n-1趟。

    比如,初始序列: [1, 5, 4, 3, 2]

    第1趟: [1, 4, 3, 2 ] 5

    第2趟: [1, 3, 2 ] 4, 5

    ......

    - (void)bubbleSort:(NSMutableArray *)array
    {
        int i, y;
        BOOL bFinish = YES;
        for (i = 1; i<= [array count] && bFinish; i++) {
            bFinish = NO;
            for (y = (int)[array count]-1; y>=i; y--) {
                if ([[array objectAtIndex:y] intValue] < [[array objectAtIndex:y-1] intValue]) {
                    [array exchangeObjectAtIndex:y-1 withObjectAtIndex:y];
                    bFinish = YES;
                }
            }
        }
    }

    二、简单选择排序算法

    简单选择排序的基本思想:

    1.第一趟在初始序列[0 ~ n-1]中找最小值元素,并与位置为0的元素交换位置。

    2.第i趟在序列[i-1, n-1]中进行,找到最小值元素与位置为i-1的元素交换位置。每次决定一个元素的位置,经过n-1趟后使得初始序列有序。

    比如,初始序列:[1, 5, 4, 3, 2]

    第1趟:1 [5, 4, 3, 2]

    第2趟:1 2 [4, 3, 5]

    ......

    - (void)selectSort:(NSMutableArray *)array
    {
        int i, j;
        for (i=0; i<array.count-1; i++) {
            
            int index = i;
            for (j = i+1; j<array.count; j++) {
                if ([array[j] intValue] < [array[index] intValue]) {
                    index = j;
                }
            }
            
            [array exchangeObjectAtIndex:i withObjectAtIndex:index];
        }
    }

    三、快速排序算法 (reference : 百度百科)

    1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
    2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];
    3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]和A[i]互换;
    4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;
    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-完成的时候,此时令循环结束)。
     
     
     
    /**
     快速排序方法
     
     @param array      源数组
     @param startIndex  开始Index
     @param endIndex 结束Index
     */
    -(void)quickSortDataArray:(NSMutableArray *)array withStartIndex:(NSInteger)startIndex andEndIndex:(NSInteger)endIndex{
        
        //只是一个基本的判断,如果数组长度为0或1时返回。
        if (startIndex >= endIndex) {
            
            return ;
        }
        
        NSInteger i = startIndex;
        NSInteger j = endIndex;
        
        //记录比较基准数
        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 quickSortDataArray:array withStartIndex:startIndex andEndIndex:i - 1];
        //排序基准数右边的
        [self quickSortDataArray:array withStartIndex:i + 1 andEndIndex:endIndex];
    }
    更多排序算法解析(最基本的7种)
     
     
     
     
  • 相关阅读:
    Android开发:关于WebView
    PHP+JQUEY+AJAX实现分页
    Bootstrap入门(二)栅格
    BootStrap入门教程 (一)
    mac 终端命令
    没有功能需求设计文档?对不起,拒绝开发!
    React 入门教程
    Webpack+React+ES6开发模式入门指南
    webpack2.0+ vue2.0
    一个小时学会jQuery
  • 原文地址:https://www.cnblogs.com/ouyangfang/p/6670107.html
Copyright © 2011-2022 走看看