三大基础排序之——插入排序
来源:互联网 发布:班班通教学软件下载 编辑:程序博客网 时间:2024/06/06 09:36
前言:
中国人很喜欢玩扑克牌,在我们摸牌的过程中就承载了这么一个思想,当扑克牌没有在我们手中的时候它是没有顺序的,几个人轮流摸牌。现在你手里已经有两张扑克牌了,我们会下意识的把下一次摸到的小的牌放在左边,摸到的大的排放到右边。而这个“下意识”就是我们在对我们手上的扑克牌进行了一个简单的插入排序。
基本原理:
输入一个元素,检查数组列表中的每个元素,将其插入到一个已经排好序的数列中的适当位置,使数列依然有序,当最后一个元素放入合适位置时,该数组排序完毕。
步骤 拆解:
1.从第一个元素开始,该元素可以认为已经被排序
2.取出下一个元素,在已经排序的元素序列中从后向前扫描
3.如果该元素(已排序)大于新元素,将该元素移到下一位置
4.重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
5.将新元素插入到该位置后
6.重复步骤2~5
动态演示
时间复杂度及稳定性
最坏情况:O(N^2)
最好情况:O(N)
稳定性:不稳定
分析:
在最坏情况下,数组完全逆序,插入第2个元素时要考察前1个元素,插入第3个元素时,要考虑前2个元素,……,插入第N个元素,要考虑前 N - 1 个元素。因此,最坏情况下的比较次数是 1 + 2 + 3 + ... + (N - 1),等差数列求和,结果为 N^2 / 2,所以最坏情况下的复杂度为 O(N^2)。
最好情况下,数组已经是有序的,每插入一个元素,只需要考查前一个元素,因此最好情况下,插入排序的时间复杂度为O(N) 。
稳定性,对于有序区并不是完全有序,在排序的过程中会不断的在有序的任何位置插入一个新的元素,有序区的元素并不是完全不变的,所以所说插入排序是不稳定的。
代码
namespace 插入排序{ class Program { static void Main(string[] args) { //初始化 int i; int j; swap swap = new swap(); int[] Array = new int[10]; Random ran = new Random(); //实例化产生随机数的变量 int n = Array.Length-1; Console.WriteLine("\n 插入排序 大—>小\n"); Console.Write(" 【原始数列】:"); //自动产生0~100的随机数 并显示 for ( i = 0; i < n; i++) { Array[i] = ran.Next(0, 100); // 给数组赋值 Console.Write(Array[i] + " "); //打印产生的随机数,显示在屏幕上 } Console.WriteLine(); //********************************************************************************************************************************* //从大到小排序 for ( i = 1; i < n; i++) { if (Array[i] > Array[i - 1]) //待排元素是否在有序区里 { int temp = Array[i]; //把待排元素的值拿出来 for (j = i - 1; j >= 0; j--) { if (temp < Array[j]) break; Array[j + 1] = Array[j]; //所有数组下标向后一个,值不变 } Array[j + 1] = temp; //将待排元素插入 找到的位置 } //*********************************************************************************************************************************** //显示排序过程 Console.WriteLine(); Console.Write("第" + i + "趟后,排序结果为:"); for (int z = 0; z < n; z++) { Console.Write(Array[z] + " "); } } //输出排序后的数列 Console.WriteLine(); Console.WriteLine(); Console.Write(" 【排序后的数列】:"); for (i = 0; i < n; i++) { Console.Write(Array[i] + " "); } Console.ReadLine(); } }}
总结:
该博客主要讲解插入排序的基本原理,时间复杂度,实现过程,及其代码实,仅供参考,如若有理解不对的地方,还请指出来,以便更正,共同学习,共同进步。
- 三大基础排序之——插入排序
- 三大基础排序之——冒泡排序
- 三大基础排序之——选择排序
- 算法基础之排序—插入排序
- 【基础算法】排序-简单排序之三(插入排序)
- 基础排序算法(三)——对半插入排序
- 九大排序之——插入排序
- 基本排序方法之三——直接插入排序
- 一句话明白排序算法之三——插入排序
- 排序之三:插入排序
- 排序之三:插入排序
- 三大简单排序算法——插入、选择、冒泡
- 排序算法三——插入排序
- 三大排序:选择排序,冒泡排序,插入排序
- 基础算法系列(三)——插入排序
- 排序——插入排序之直接插入排序
- 排序算法—插入排序之直接插入排序
- 十大排序算法之插入排序
- Modern Java Recipes.mobi Modern Java Recipes.pdf
- MySQL复制
- make生成执行文件的过程
- python(一)简单WEB服务器
- 记录我的unity学习之旅
- 三大基础排序之——插入排序
- Java垃圾回收(整理)
- Tomcat优化,JNDI,连接池,数据源
- 排序
- 浮点数的二分写法以及判断大小
- Py_ClassAndMod
- sql片段
- gcc 5.3 install
- x&(x-1)