zoukankan      html  css  js  c++  java
  • 直接插入排序法


    直接插入排序(straight insertion sort)是一个简单的排序方法,他的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的,记录数增1的有序表。

    例如,已知待排序的一组记录初始排列如下:
          49,38,65,97,76,13,27,49 -----a

    假设排序过程中,前4个记录已经有序,构成了一个有序列,如
          38,49,65,97 ----------b

    现在要将第五个记录76插入到上面序列中,以得到一个新的含5个记录的有序序列。在b序列中进行查找以确定76应该插入的位置,然后进行插入。

    假设从左开始查找,则76应该插入到65和97之间。这就是一趟直接插入排序。

    一般情况下,第i趟直接插入排序操作为:在含有i-1个序列中有序子序列中插入一个新记录,变成含有i个有序序列的子序列

    和顺序查找类似,为了在查找插入位置的过程中避免数组下标出界,在r【0】位置设置监视哨。

    在自i-1起往前搜索的过程中,可以同时后移记录。

    整个排序过程为进行n-1趟插入,即:先将序列中第1个记录看成是一个有序的子序列,然后从第二个记录器开始逐个插入,直至整个序列变成关键字非递减有序序列为止

    -------------------------
    void InsertSort(SqList @l)
    {
    for( i = 2 ; i <= l.length; ++i)
    {
    if(LT(l.r[i].key,l.r[i-1].key))//小于,将l.r[i]插入有序表
    {
    l.r[0] = l.r[i];//复制为哨兵
    l.r[i] = l.r[i-1];
    for( j = i - 2; lt(l.r[0].key,l.r[j].key) ; --j)
        l.r[j+1] = l.r[j];//记录后移
    l.r[j+1] = l.r[0];//插入到正确位置
    }
    }
    }

    *********************************************************************************************

    插入排序用的是顺序结构来描述,也就是数组结构来描述。
    通过比较大小以后,要把一个合适的数据插入到数组的某个位置上来,但是因为是数组结构,要添加某个数据到数组的某个
    位置上,就必须把这个位置给空余出来。所以就要把这个位置以及这个位置以后的数据全部后移,这样才会空出这个位置来
    然后把数据赋值给这个位置,这也就是代码中内层for循环的意义和作用。
    数组的0位置起哨兵作用,数组中两两比较以后,较小就赋值给哨兵,哨兵就是要待插入的数据,因此只要比哨兵大的数据都应该向后移动,这样就能空余出来一个位置,让哨兵来填充



    c#版本的直接插入排序算法。

    static void Order(ref int[] array)
            {
                for (int i = 2; i < array.Length; ++i)
                {
                    if (array[i] < array[i - 1])
                    {
                        array[0] = array[i];
                        array[i] = array[i - 1];
                        int j = 0;
                        for ( j = i - 2; array[0] < array[j]; --j)
                        {
                            array[j + 1] = array[j];
                        }
                        array[j + 1] = array[0];
                    }
                }
            }

    本文使用Blog_Backup未注册版本导出,请到soft.pt42.com注册。

  • 相关阅读:
    菜单无限极分类核心代码
    获取页面中更新删除传过来的id
    CI循环数组问题
    ci框架model中的进行增删改的写法
    MySQL DBA的修炼与未来(参考篇)
    Linux学习笔记(13)linux软件安装rpm与yum--理论篇
    Linux学习笔记(12)linux文件目录与用户管理
    Linux学习笔记(11)linux网络管理与配置之一——配置路由与默认网关,双网卡绑定(5-6)
    Linux学习笔记(10)linux网络管理与配置之一——主机名与IP地址,DNS解析与本地hosts解析(1-4)
    自定义流水号,前置加0
  • 原文地址:https://www.cnblogs.com/zjypp/p/2319374.html
Copyright © 2011-2022 走看看