从上一则博客讲起,目前我们已经知晓了冒泡排序这种算法,接下来就来看看第二种排序算法——插入排序
(感谢读者朋友些,这是传送门:冒泡排序)
正式开始
同样的,这还是从小到大排序。我懒惰,不想写从大到小的,聪明的读者朋友应该会写。
顾名思义,插入排序,就是把每一个需要排序的元素,按照它自己的大小插入到前面的已经排序完成的区间里面,有方向性的扫描。
有两种插入排序,一种是直插(扑克直接插入排序),另一种是希尔插入排序。介于希尔插入的排序方式具有针对性,且新手难以直接理解(再加上作者懒惰),所以本文只介绍直插!
(希尔插入也提一下,就是分段排序最后逼近有序)。
是不是超级简单……
代码思路
假设存在一个无序数组M[1,2,3,......,n-1,n-2]
初始状态
M[1]肯定是有序的嘛(只有一个元素,你自己细品)。
M[2,......,n]肯定是无序区间。
插入第一次
将M[i]插入M[1,......,i-1]中。
继续插
从i=2 到 i=n,一个一个依次试着去插,插进去了为止。
插完了
存在有序区间M[1,2,......n].
说简单点,就像斗地主清牌的时候。
你现在手上有的牌是:
7 , 4 , 10 , Q , J
首先你会以 7 为基础,因为 4 比 7 小,所以你会把它放在 7 左边;接着 10 比 7 与 4 都要大,所以你会把 10 放在最右边......以及类推。
最后整理为:
4 , 7 , 10 , J , Q
代码实例
(Ctrl+c&Ctrl+v)
这里是方法代码
public static void Insertion_Sort(int[] List)
{
for(int i = 1; i < List.Length; i++)
{
int Save = List[i];//储存有序区间内的元素
int Index = i;//获得目前的下标
while ((Index > 0) && (List[Index - 1] > Save))
{
List[Index] = List[Index-1];//交换数据
--Index;//注意,一定是"--Index"而不是"Index--",因为下面还有个Index需被原使用
}
List[Index] = Save;
}
}
我也啊把那个项目代码发一下
using System;
namespace straight_insertion_sort
{
class Program
{
static void Main(string[] args)
{
int[] Example = new int[] {34,115415,32,42,42,32,44 };
Insertion_Sort(Example);
foreach(var item in Example)
{
Console.Write(item + ",");
}
Console.Read();
}
public static void Insertion_Sort(int[] List)
{
for(int i = 1; i < List.Length; i++)
{
int Save = List[i];//储存有序区间内的元素
int Index = i;//获得目前的下标
while ((Index > 0) && (List[Index - 1] > Save))
{
List[Index] = List[Index-1];//交换数据
--Index;//注意,一定是"--Index"而不是"Index--",因为下面还有个Index需被原使用
}
List[Index] = Save;
}
}
}
}
最后收工了哈
感谢诸位读者
希望各位新手能手打代码,一两遍过后就会写了。
大家有什么不懂的可以问我,尽管我也才学殊浅,但也会尽力的。
(不要随便转载哦,记得给我说声)