zoukankan      html  css  js  c++  java
  • IOS算法(三)之插入排序

    直接插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其keyword大小插入到前面已经排好序的子序列中的适当位置,直到所有记录插入完毕为止。

     设数组为a[0…n-1]

    1.      初始时。a[0]自成1个有序区,无序区为a[1..n-1]。令i=1

    2.      a[i]并入当前的有序区a[0…i-1]中形成a[0…i]的有序区间。

    3.      i++并反复第二步直到i==n-1

    排序完毕。


    代码实现:

    //

    //  main.m

    //  算法----插入排序(Insertion sort)

    //  Copyright (c) 2014 summer2014mht@sina.com. All rights reserved.

    //


    #import <Foundation/Foundation.h>

    int main(int argc, const char * argv[])

    {

        int array[] = {3,2, 6, 9, 8, 5, 7, 1, 4};

        //为了添加可移植性(採取sizeof())计算数组元素个数count

        int count = sizeof(array) /sizeof(array[0]);

        //逐个记录,插入有序数列

        for (int i = 1; i < count; i++) {

            int j = i;  //j是一个坑, 确定坑的位置,再把数从坑里取出来,注意顺序

            int temp = array[i];   //temp 是从坑里取数

            //把a[i]插入有序序列  

            while (j > 0 && temp < array[j -1]) {    //j > 0 防止越界。写&&前面效率更高

                array[j] = array[j - 1];

                j--;

            }

            array[j] = temp;

        }

        for (int i = 0; i < count; i++) {

            printf("[%2d]: %d ", i, array[i]);

        }

        return 0;

    }


    附:效率分析

    稳定
    空间复杂度O(1)
    时间复杂度O(n2)
    最差情况:反序。须要移动n*(n-1)/2个元素
    最好情况:正序,不须要移动元素

    数组在已排序或者是近似排序时。插入排序效率的最好情况执行时间为O(n)

    插入排序最坏情况执行时间和平均情况执行时间都为O(n2)

    通常,插入排序呈现出二次排序算法中的最佳性能。

    对于具有较少元素(如n<=15)的列表来说,二次算法十分有效。

    在列表已被排序时,插入排序是线性算法O(n)

    在列表近似排序时。插入排序仍然是线性算法。

    在列表的很多元素已位于正确的位置上时。就会出现近似排序的条件。

    通过使用O(nlog2n)效率的算法(如高速排序)对数组进行部分排序,

    然后再进行选择排序,某些高级的排序算法就是这样实现的。

    从上述分析中能够看出,直接插入排序适合记录数比較少、给定序列基本有序的情况


  • 相关阅读:
    一致性哈希算法
    Discourse 的标签(Tag)只能是小写的原因
    JIRA 链接 bitbucket 提示错误 Invalid OAuth credentials
    JIRA 如何连接到云平台的 bitbucket
    Apache Druid 能够支持即席查询
    如何在 Discourse 中配置使用 GitHub 登录和创建用户
    Apache Druid 是什么
    Xshell 如何导入 PuTTYgen 生成的 key
    windows下配置Nginx支持php
    laravel连接数据库提示mysql_connect() :Connection refused...
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5198206.html
Copyright © 2011-2022 走看看