C#数据结构与算法系列(二十):插入排序算法(InsertSort)
1.介绍
插入排序算法属于内部排序算法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的
2.思想
插入排序(Insertion Sorting)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,
无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。
3.思路图

4.代码演示
using System; namespace DataStructure
{
public class InsertSort
{
public static void Test()
{
int[] arr = { , , , }; Console.WriteLine($"排序的数组:{ArrayToString(arr)}"); Console.WriteLine("\n封装后的插入排序"); Sort(arr); Console.WriteLine("\n封装前的插入排序"); arr = new int[] { , , , }; {
int insertValue = arr[]; int insertIndex = - ; while (insertIndex >= && insertValue < arr[insertIndex])
{
arr[insertIndex + ] = arr[insertIndex]; insertIndex--;
} if (insertIndex + != )
{
arr[insertIndex + ] = insertValue;
} Console.WriteLine($"\n第{1}轮排序后的结果:{ArrayToString(arr)}");
}
{
int insertValue = arr[]; int insertIndex = - ; while (insertIndex >= && insertValue < arr[insertIndex])
{
arr[insertIndex + ] = arr[insertIndex]; insertIndex--;
} if (insertIndex + != )
{
arr[insertIndex + ] = insertValue;
} Console.WriteLine($"\n第{2}轮排序后的结果:{ArrayToString(arr)}");
} {
int insertValue = arr[]; int insertIndex = - ; while (insertIndex >= && insertValue < arr[insertIndex])
{
arr[insertIndex + ] = arr[insertIndex]; insertIndex--;
} if (insertIndex + != )
{
arr[insertIndex + ] = insertValue;
} Console.WriteLine($"\n第{3}轮排序后的结果:{ArrayToString(arr)}");
}
} /// <summary>
/// 插入排序封装
/// </summary>
/// <param name="arr"></param>
private static void Sort(int[] arr)
{
//要循环的次数
for (int i = ; i < arr.Length; i++)
{
//设置待插入的值
int insertValue = arr[i]; //设置待插入的索引
int insertIndex = i - ; //1.insertIndex >= 0保证在给insertValue找插入位置不越界
//2.insertValue < arr[insertIndex] 待插入的数,还没有找到插入位置
//也就是说当待插入的值与前一个值比较,如果小于那么就把值后移
while (insertIndex >= && insertValue < arr[insertIndex])
{
arr[insertIndex + ] = arr[insertIndex]; //一直与前一个比较,知道索引到0
insertIndex--;
} //当索引位置变了后,就说明插入位置找到
if (insertIndex + != i)
{ arr[insertIndex + ] = insertValue;
} Console.WriteLine($"\n第{i}轮排序后的结果:{ArrayToString(arr)}");
}
} /// <summary>
/// 将数组转换成String
/// </summary>
/// <param name="arr"></param>
/// <returns></returns>
public static string ArrayToString(int[] arr)
{ string result = ""; for (int i = ; i < arr.Length; i++)
{
result += arr[i] + ",";
} return result;
}
}
}
5.结果图

C#数据结构与算法系列(二十):插入排序算法(InsertSort)的更多相关文章
- Web 开发人员和设计师必读文章推荐【系列二十九】
<Web 前端开发精华文章推荐>2014年第8期(总第29期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...
- Web 前端开发人员和设计师必读文章推荐【系列二十八】
<Web 前端开发精华文章推荐>2014年第7期(总第28期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...
- Web 前端开发人员和设计师必读精华文章【系列二十六】
<Web 前端开发精华文章推荐>2014年第5期(总第26期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...
- Web 前端开发精华文章推荐(HTML5、CSS3、jQuery)【系列二十二】
<Web 前端开发精华文章推荐>2014年第一期(总第二十二期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML ...
- Web 前端开发精华文章集锦(jQuery、HTML5、CSS3)【系列二十】
<Web 前端开发精华文章推荐>2013年第八期(总第二十期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各种增强网站用户体验的 jQuery 插件,展示前沿的 HTML5 和 C ...
- 【数据结构】 最小生成树(二)——kruskal算法
上一期说完了什么是最小生成树,这一期咱们来介绍求最小生成树的算法:kruskal算法,适用于稀疏图,也就是同样个数的节点,边越少就越快,到了数据结构与算法这个阶段了,做题靠的就是速度快,时间复杂度小. ...
- 排序系列 之 折半插入排序算法 —— Java实现
基本思想: 折半插入算法是对直接插入排序算法的改进,排序原理同直接插入算法: 把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序表中有n-1个元素:排序过程即每次从无序表中 ...
- CRC16算法之二:CRC16-CCITT-XMODEM算法的java实现
CRC16算法系列文章: CRC16算法之一:CRC16-CCITT-FALSE算法的java实现 CRC16算法之二:CRC16-CCITT-XMODEM算法的java实现 CRC16算法之三:CR ...
- SSE图像算法优化系列二十四: 基于形态学的图像后期抗锯齿算法--MLAA优化研究。
偶尔看到这样的一个算法,觉得还是蛮有意思的,花了将近10天多的时间研究了下相关代码. 以下为百度的结果:MLAA全称Morphological Antialiasing,意为形态抗锯齿是AMD推出的完 ...
- SSE图像算法优化系列二十二:优化龚元浩博士的曲率滤波算法,达到约1000 MPixels/Sec的单次迭代速度
2015年龚博士的曲率滤波算法刚出来的时候,在图像处理界也曾引起不小的轰动,特别是其所说的算法的简洁性,以及算法的效果.执行效率等方面较其他算法均有一定的优势,我在该算法刚出来时也曾经有关注,不过 ...
随机推荐
- 容器技术之Dockerfile(二)
前文我们聊到了什么是dockerfile,它的主要作用以及dockerfile的一些基本指令的使用方法,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13019 ...
- Java实现 蓝桥杯 算法训练 Balloons in a Box
试题 算法训练 Balloons in a Box 问题描述 你要写一个程序,使得能够模拟在长方体的盒子里放置球形的气球. 接下来是模拟的方案.假设你已知一个长方体的盒子和一个点集.每一个点代表一个可 ...
- (Java实现) 洛谷 P1098 字符串的展开
import java.util.ArrayList; import java.util.Scanner; public class zifuchuandezhankai { static Array ...
- (Java实现) 图的m着色问题
图的m着色问题 [问题描述] 给定无向连通图G和m种不同的颜色.用这些颜色为图G的各顶点着色,每个顶点着一种颜色.如果有一种着色法使G中每条边的2个顶点着不同颜色,则称这个图是m可着色的.图的m着色问 ...
- Java实现 蓝桥杯VIP 算法训练 二元函数
问题描述 令二元函数f(x,y)=ax+by,a和b为整数,求一个表达式S的值. 只有满足以下要求的表达式才是合法的: 1.任意整数x是一个合法的表达式: 2.如果A和B都是合法的表达式,则f(A,B ...
- Java实现 蓝桥杯VIP 算法提高 乘法运算
算法提高 乘法运算 时间限制:1.0s 内存限制:512.0MB 问题描述 编制一个乘法运算的程序. 从键盘读入2个100以内的正整数,进行乘法运算并以竖式输出. 输入格式 输入只有一行,是两个用空格 ...
- Java实现 蓝桥杯 历届真题 稍大的串
串可以按照字典序进行比较.例如: abcd 小于 abdc 如果给定一个串,打乱组成它的字母,重新排列,可以得到许多不同的串,在这些不同的串中,有一个串刚好给定的串稍微大一些.科学地说:它是大于已知串 ...
- Linux vi使用技巧
导入命令执行结果:r !命令,例如:导入已经存在的文件内容到当前文件 导入命令执行的结果到当前文件 定义快捷键,map 快捷键 触发命令,例如:map ^P I#<ESC>(使用CRTL+ ...
- Linux目录结构与功能
在Linux中,一切皆文件.所以,Linux和Windows目录有很大的不同,它没有明确的盘符,它的目录就像一棵大树一样,顶层目录就是根目录:/ ,然后下面又有很多个分支,分支可以再分,从而形成一个庞 ...
- js事件的一些兼容写法
事件兼容 事件对象的兼容 获取键码兼容 默认行为兼容 阻止事件冒泡兼容 事件监听兼容 ---- 封装 删除事件监听兼容 ---- 封装 事件委托->获取事件源兼容