zoukankan      html  css  js  c++  java
  • 插入排序——1直接插入排序实现

    直接插入排序的一种实现:

    public IList<int> InsertionSort(int[] ary)
            {
                var len = ary.Length;
                for (int i = 1; i < len; i++)
                {
                    var key = ary[i];
                    for (int j = 0; j < i; j++)//从前向后找
                    {
                        if (key < ary[j])
                        {
                            for (int k = i; k > j; k--)//从后向前逐个移动
                            {
                                ary[k] = ary[k - 1];
                            }
                            ary[j] = key;
                            break;//每次插入一个值后,完成此次遍历
                        }
                    }
                }
                return ary.ToList();
            }

    这种方法,是从小到大(从左到右)的顺序来寻找插入的位置,每次循环,在已排好的列表中,找到“第一个”,比当前要插入的值大的数,然后从最后一个位置开始,从右向左逐个后移,空出这个比当前值大的数的位置后,将当前值插入进去。然后结束本次的循环。看代码可发现,这种方式写起来略微复杂。

    另一种实现方法,是从大到小(从右到左)的顺序来找插入的位置,代码如下:

    public IList<int> InsertionSort(int[] ary)
            {
                var len = ary.Length;
                for (int i = 1; i < len; i++)
                {
                    var key = ary[i];
                    int j = i - 1;
                    while (j >= 0 && key < ary[j])//从后往前,一边找一边移动
                    {
                        ary[j + 1] = ary[j];
                        j--;
                    }
                    ary[j + 1] = key;
                }
                return ary.ToList();
            }

    外部循环一样,内部循环,每次从最后一个已排好序的元素开始,使用while一边比较一边移动。如果已排序的值小于当前要插入的值,则结束循环。这时要插入的位置也已经疼出来了,只需将当前值插入即可。这里因为每次做了j--,因此在插入的时候,需要先进行加1。

    直接插入排序的特点是使用“常数个”额外的内存空间,即空间复杂度为O(1)。而时间复杂度是O(n*n)。

  • 相关阅读:
    Linux设备驱动之Ioctl控制
    虚拟内存与物理内存的区别
    怎么远程控制他人电脑
    二维数组和指针
    二维数组和指针(C语言)
    帧率、码流与分辨率相关知识
    深入理解FIFO
    安装lsb_release
    Linux初学之vmware Workstation 网络连接三种模式
    RTSP协议学习笔记
  • 原文地址:https://www.cnblogs.com/asenyang/p/6912043.html
Copyright © 2011-2022 走看看