博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
小小c#算法题 - 5 - 插入排序
阅读量:6512 次
发布时间:2019-06-24

本文共 2033 字,大约阅读时间需要 6 分钟。

插入排序是最简单(最容易理解)的一种排序算法。

其基本操作是将一个数插入到已经有序的数组中,那么我们要做的是确定插入到什么位置,所有在这个位置之后的数后移一个位置,从而给这个要插入的数腾出位置。所以关键点是找插入位置。

最简单的办法,从最后一个元素开始找,边找边后移,一直到找到合适的插入位置。

首先,数组第一个元素我们视为有序。第二个元素,跟第一个比较排序之后,前两个元素组成一个有序序列。第n个元素,从前面的有序序列(n-1个元素)的最后一个元素开始比较,直到找到合适的插入位置,插入即可,最终形成一个有序序列。

 代码(c#):

static void InsertSort(int[] numbers)        {            int temp, j;            for (int i = 1; i < numbers.Length; i++)            {                temp = numbers[i];                j = i;                while (j > 0 && numbers[j - 1] > temp)                {                    numbers[j] = numbers[j - 1];                    j--;                }                numbers[j] = temp;            }        }

  

还有一种稍高效一点的方法,因为我们要插入的数组已经是有序的了,所以可以用二分查找找到插入位置,然后后移这个位置之后的元素,插入新值。

代码(c#):

static void BinaryInsertSort(int[] myArray)        {            for (int i = 1; i < myArray.Length; i++)            {                if (myArray[i] < myArray[i - 1])                {                    int low = 0;                    int high = i - 1;                    int mid = (low + high) / 2;                    // 找到插入位置 low                    while (low <= high)                    {                        if (myArray[i] >= myArray[mid])                        {                            low = mid + 1;                            mid = (low + high) / 2;                        }                        if (myArray[i] < myArray[mid])                        {                            high = mid - 1;                            mid = (low + high) / 2;                        }                    }                    // 将插入位置后面的元素后移一个位置,后移之前保存要插入的值myArray[i]                    int temp = myArray[i];                    for (int j = i; j > low; j--)                    {                        myArray[j] = myArray[j - 1];                    }                    myArray[low] = temp;                }            }        }

 

最后,从代码可以看出。直接插入排序的时间复杂度是O(n*n)。虽然折半插入排序减少了关键字间的比较次数,但移动记录的次数不变,所有时间复杂度仍是O(n*n)。

转载于:https://www.cnblogs.com/CSharpSPF/archive/2012/04/05/2433886.html

你可能感兴趣的文章
Unity Shader 噪声消融特效 - 剑灵死亡特效
查看>>
Eclipse 自动生成 Ant的Build.xml 配置文件
查看>>
添加一条信息到列表,如果重复就替换,
查看>>
C#基础第五天
查看>>
python 小数相加报错 invalid literal for int() with base 10
查看>>
【ubuntu】linux链接库
查看>>
uva 12325 枚举暴力 b
查看>>
多线程问题(JVM重排序)
查看>>
LeetCode 459 Repeated Substring Pattern
查看>>
POJ 3268 Silver Cow Party
查看>>
EMLS项目推进思考
查看>>
Eclipse快捷键 10个最有用的快捷键
查看>>
2018-2019-1 20165302 实验五 通讯协议设计
查看>>
Golang 知识点总结
查看>>
JAVA 8 特性
查看>>
算法设计 - LCS 最长公共子序列&&最长公共子串 &&LIS 最长递增子序列
查看>>
WebService之Axis2快速入门(7): Spring与axis整合发布为WebServic
查看>>
Uliweb查看模板调用关系
查看>>
C#与PHP通信压缩
查看>>
关于 Linux
查看>>