zoukankan      html  css  js  c++  java
  • 插入排序——2折半插入排序实现

    折半插入与直接插入的不同在于,搜索要插入的位置的时候,使用的是折半搜索(二分搜索)。这种查找方式理论上比顺序查找的效率要高。

    其代码实现如下:

    public IList<int> InsertionSort(int[] ary)
            {
                for (int i = 1; i < ary.Length; i++)
                {
                    int low = 0;
                    int high = i - 1;
                    var key = ary[i];
                    //不断的折半
                    while (low <= high)//注意包含等号
                    {
                        //找出中间值
                        int mid = (low + high) / 2;
                        //如果大于中间值
                        if (key > ary[mid])
                        {
                            //在大于中间值的那部分查找
                            low = mid + 1;
                        }
                        else
                        {
                            //在小于中间值的那部分查找
                            high = mid - 1;
                        }
                    }
                    //使用low来进行移动,此时low是要插入的位置
                    for (int j = i; j > low; j--)
                    {
                        ary[j] = ary[j - 1];
                    }
                    ary[low] = key;
    
                    ////使用high进行移动,此时high是要插入的位置之前的一个位置
                    //for (int j = i; j > high + 1; j--)
                    //{
                    //    ary[j] = ary[j - 1];
                    //}
                    ////插入到指定的位置
                    //ary[high + 1] = key;
                }
                return ary.ToList();
            }

    在内层的while循环,使用的是折半查找,找到在low>high的时候,low的值就是要插入的位置。后面的移动元素和将当前元素插入的操作与直接插入排序是一样的。

    最后我们实现一个单独的折半查找的方法,可以进行对比。

    public int BinarySearch(int[] ary, int key)
            {
                int low = 0;
                int high = ary.Length - 1;
                int mid = 0;
                while (low < high)
                {
                    mid = (low + high) / 2;
                    if (ary[mid] == key)
                    {
                        return mid;
                    }
                    else if (ary[mid] > key)
                    {
                        high = mid - 1;
                    }
                    else
                    {
                        low = mid + 1;
                    }
                }
                return -1;
            }

    这个方法返回的是key在ary中的下标,如果ary中不包含key这个元素,则返回-1。在折半查找在用作插入排序时,需要进行一些修改。

    记住代码的写法,以后用的时候,直接按照固定格式来写就行了。

  • 相关阅读:
    枚举扩展,感觉用处很大
    基础缓存操作类
    ASP.NET 4.0 全局取消表单危险字符验证
    拦截所有经过IOC的方法
    关于使用EPPlus插入列,名称管理器公式失效问题案列分析
    IocFactory容器实体
    线程扩展
    IEnumerable扩展支持Add,Remove等操作
    自定义特性。配合枚举使用棒棒哒
    在数据仓储的情况下进一步封装数据库基础操作,此版本为异步版本
  • 原文地址:https://www.cnblogs.com/asenyang/p/6912534.html
Copyright © 2011-2022 走看看