C#插入排序
C#插入排序
C#插入排序一、插入排序的种类
包括:直接插入排序,二分插入排序(又称折半插入排序),链表插入排序,希尔排序(又称缩小增量排序)。属于稳定排序的一种(通俗地讲,就是两个相等的数不会交换位置) 。
二、插入排序算法原理
插入即表示将一个新的数据插入到一个有序数组中,并继续保持有序。例如有一个长度为N的无序数组,进行N-1次的插入即能完成排序
第一次,数组第1个数认为是有序的数组,将数组第二个元素插入仅有1个有序的数组中;
第二次,数组前两个元素组成有序的数组,将数组第三个元素插入由两个元素构成的有序数组中.....
第N-1次,数组前N-1个元素组成有序的数组,将数组的第N个元素插入由N-1个元素构成的有序数组中,则完成了整个插入排序。
三、算法分析
平均时间复杂度:O(n2)
空间复杂度:O(1) (用于记录需要插入的数据)
四、插入排序稳定性
插入排序是在一个已经有序的小序列的基础上,一次插入一个元素。当然,刚开始这个有序的小序列只有1个元素,就是第一个元素
比较是从有序序列的末尾开始,也就是想要插入的元素和已经有序的最大者开始比起,如果比它大则直接插入在其后面,否则一直往前找直到找到它该插入的位置。如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。
所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳定的。
五、C#插入排序算法
/// <summary>
/// 插入排序(升序)
/// </summary>
public static int[] InsertionSort(int[] needSortArray)
{
for (int i = 1; i < needSortArray.Length; i++)
{
int key = needSortArray[i];// 相当于[当前牌],这里赋给key起临时保存的作用
// 将当前牌与手中的牌依次比较
int j = i - 1;
while (j >= 0 && key < needSortArray[j])
{
// 将元素后移
needSortArray[j + 1] = needSortArray[j];
j--;
}
// j+1(因为上边的while循环多做了一次判断)即为当前牌插入的位置
needSortArray[j + 1] = key;
}
return needSortArray;
}
六、插入排序算法实例
以下面5个无序的数据为例:
65 27 59 64 58
第1次插入: 27 65 59 64 58
第2次插入: 27 59 65 64 58
第3次插入: 27 59 64 65 58
第4次插入: 27 58 59 64 65
七、算法优化
插入排序中,总是先寻找插入位置,然后在实行挪动和插入过程;寻找插入位置采用顺序查找的方式(从前向后或者从后向前),既然需要插入的数组已经是有序的,那么可以采用二分查找方法来寻找插入位置,提高算法效率,但算法的时间复杂度仍为O(n2)。
//查找数值iData在长度为iLen的pDataArray数组中的插入位置
int FindInsertIndex(int *pDataArray, int iLen, int iData)
{
int iBegin = 0;
int iEnd = iLen - 1;
int index = -1; //记录插入位置
while (iBegin <= iEnd)
{
index = (iBegin + iEnd) / 2;
if (pDataArray[index] > iData)
iEnd = index - 1;
else
iBegin = index + 1;
}
if (pDataArray[index] <= iData)
index++;
return index;
}
/********************************************************
*函数名称:BinaryInsertSort
*参数说明:pDataArray 无序数组;
* iDataNum为无序数据个数
*说明: 二分查找插入排序
*********************************************************/
void BinaryInsertSort(int* pDataArray, int iDataNum)
{
for (int i = 1; i < iDataNum; i++) //从第2个数据开始插入
{
int index = FindInsertIndex(pDataArray, i, pDataArray[i]); //二分寻找插入的位置
if (i != index) //插入位置不为i,才挪动、插入
{
int j = i;
int temp = pDataArray[i];
while (j > index) //挪动位置
{
pDataArray[j] = pDataArray[j-1];
j--;
}
pDataArray[j] = temp; //插入
}
}
}
- pythondict排序原理(Python标准库使用OrderedDict类的实例讲解)
- dedecms新字段(DEDECMSv5.6 tags.php标签不能按照时间排序的问题)
- sqlserver降序排列(SQL SERVER临时表排序问题的解决方法)
- mysql 分组自定义排序(正排倒排,并不是 MySQL 的排序的全部!)
- javascript 数组排序
- laravel时间日期字段比较(Laravel find in set排序实例)
- python实现删除列表重复元素功能(Python实现删除排序数组中重复项的两种方法示例)
- mysql中默认排序教程(基于mysql 默认排序规则的坑)
- C#排序算法的比较
- C#插入排序
- python冒泡排序代码通俗理解(详解python算法之冒泡排序)
- mysql顺序排序(Mysql 中文排序规则说明)
- easyUI DataGrid 显示可排序的列
- sql语句groupby分组后怎么显示(SQL group by去重复且按照其他字段排序的操作)
- php中数组使用技巧(php常用经典函数集锦数组、字符串、栈、队列、排序等)
- sqlserver修改排序规则几种方法(SQL Server 分页编号的另一种方式推荐)
- 老弄堂里的市井味道(老弄堂里的市井味道)
- 小米音乐可绑定QQ音乐, QQ音乐 真的会消失在小米的设备上吗(小米音乐可绑定QQ音乐)
- 小米Watch S1评测 或许能成为小米冲击高端可穿戴设备的里程碑(小米WatchS1评测或许能成为小米冲击高端可穿戴设备的里程碑)
- 手机QQ与小米路由器在一起 明天揭晓,敬请期待(手机QQ与小米路由器在一起)
- 小米音乐与 QQ 音乐合作,便捷迁移会员(小米音乐与QQ音乐合作)
- 小米推出米兔儿童电话手表奥特曼版,799 元,支持微信 QQ(小米推出米兔儿童电话手表奥特曼版)
热门推荐
- vueelementui三级菜单(vue+element ui实现锚点定位)
- Mongodb数据导入导出
- pythonjson库(Python常用的json标准库)
- docker进入容器的命令(Docker 最常用的镜像命令和容器命令详解)
- sqlserver判断条件输出字符(SQL Server查询条件IN中能否使用变量的示例详解)
- python微信消息模拟请求(python实现微信机器人: 登录微信、消息接收、自动回复功能)
- js使用canvas(JavaScript canvas实现七彩时钟效果)
- htmlcanvas的使用(html2canvas生成清晰的图片实现打印的示例代码)
- 织梦源码安装数据库怎么填(Mysql修改端口号 织梦DedeCMS设置教程)
- mysqlupdate语句用法(MySQL update set 和 and的区别)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9