算法-插入排序

  插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外,而第二部分就只包含这一个元素。在第一部分排序后,再把这个最后元素插入到此刻已是有序的第一部分里的位置

  插入排序一直比较简单也是比较符合我们人们思维习惯的一种算法排序,因为我们经常会在生活中不经意的用到过这种排序。就比如QQ欢乐斗地主中,你看到牌的都是已经排好序的,系统每发一张牌就会对从头开始比较,如果发现了比这张牌小的,就把此牌放入这个位置,后面的牌都会向后推动一个位置。而新产生的牌也是个有序列的牌。

插入排序算法
 1  class Program
2 {
3 static void Main(string[] args)
4 {
5 var lst = new List<int>{ 7, 6, 22, 3, 6, 7, 3, 1, 2, 3, 4, 5, 7, 2, 345, 2, 345, 23, 45, 2345 };
6 Console.WriteLine("排序前");
7 lst.ForEach((a) => Console.Write(string.Format("{0},", a)));
8 Console.WriteLine();
9 InsertSort(lst);
10 Console.WriteLine("排序后");
11 lst.ForEach((a) => Console.Write(string.Format("{0},", a)));
12 Console.Read();
13 }
14
15 // 插入排序
16 private static void InsertSort(List<int> arr)
17 {
18 for (int i = 1; i < arr.Count; i++)
19 {
20 var index = arr[i]; // 已抽出的牌
21 for (var j = i - 1; j >= 0; j--) // 与之前已排好序的牌进行比较
22 {
23 if (index > arr[j]) // 如果找到比它小的牌 ,则插入,否则牌往后移
24 {
25 arr[j + 1] = index;
26 break;
27 }
28 else
29 {
30 arr[j +1 ] = arr[j];
31 if (j == 0) // 这说明抽出来的牌是最小的牌
32 {
33 arr[j] = index;
34 }
35 }
36 }
37
38 }
39 }

 

posted @ 2012-02-08 10:46  恋9527  阅读(153)  评论(0编辑  收藏  举报