插入排序与归并排序的C#实现

算法导论在介绍算法时列举了插入排序与并归排序,以此来说明什么事算法,算法效率以及提出了算法设计中重要的思想--分治,也就是将问题划分为规模较小的子问题。这种思想在大规模运算时具有显著的时间开销优势,例如插入排序和并归排序,其时间开销大致分别等于C1N2和C2Nlog2N。

下面介绍具体的代码:

首先是插入排序:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 
 6 namespace algorithm
 7 {
 8     class Program
 9     {
10         class InsertionSortFun
11         {
12             public void InsertionSort(int[] A)
13             {
14                 int n = A.Length;
15                 for (int j = 1; j < n; j++)                 
16                 {
17                     //所要插入的新值
18                     int key = A[j];                        
19                     int i = j - 1;
20                     //将新值与原有序列比较
21                     while ((i >= 0) && (A[i] > key))        
22                     {
23                         //交换顺序
24                         A[i + 1] = A[i];                    
25                         i = i - 1;
26                     }
27                     //插入新值
28                     A[i + 1] = key;                         
29                 }
30             }
31         }
32         
33         static void Main(string[] args)
34         {
35             //待排序数组
36             int[] X = { 45, 32, 87, 1, 8, 0, 4, 2, 55, 6, 34, 23, 82, 12, 8 };
37             //实例化插入排序
38             InsertionSortFun ISF = new InsertionSortFun();
39             ISF.InsertionSort(X);
40             //控制台打印输出
41             foreach (int item in X)
42             {
43                 Console.WriteLine(item);
44             }
45         }
46     }
47 }

输出结果为:

 

接下来是归并排序:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 
 6 namespace algorithm
 7 {
 8     class Program
 9     {
10         class MergeSortFun
11         {
12             //合并函数--用于将两个已排序的数组合并
13             private void Merge(int[] num, int start, int middle, int end)
14             {
15                 int n1 = middle - start + 1;
16                 int n2 = end - middle;
17 
18                 //声明两个数组用来容纳左右两个数组
19                 int[] L = new int[n1 + 1];
20                 int[] R = new int[n2 + 1];
21 
22                 //为新建的数组赋值
23                 for (int i = 0; i < n1; i++) 
24                 {
25                     L[i] = num[start + i];
26                 }
27                 for (int i = 0; i < n2; i++)
28                 {
29                     R[i] = num[middle + i + 1];
30                 }
31                 //设置哨兵元素
32                 L[n1] = 1000000;
33                 R[n2] = 1000000;
34 
35                 int p = 0;
36                 int q = 0;
37                 //进行合并
38                 for (int k = start; k <= end; k++) 
39                 {
40                     if (L[p] <= R[q]) 
41                     {
42                         num[k] = L[p];
43                         p++;
44                     } 
45                     else
46                     {
47                         num[k] = R[q];
48                         q++;
49                     }
50                 }                
51             }
52 
53             //递归函数
54             public void MergeSort(int[] num, int start, int end)
55             {
56                 int middle;
57                 if (start < end) 
58                 {
59                     middle = (start + end) / 2;
60                     //归并的基本思想
61                     //左排序
62                     MergeSort(num, start, middle);
63                     //右排序
64                     MergeSort(num, middle + 1, end);
65                     //合并
66                     Merge(num, start, middle, end);
67                 }
68             }
69         }
70         static void Main(string[] args)
71         {
72             //待排序数组
73             int[] X = { 45, 32, 87, 1, 8, 0, 4, 2, 55, 6, 34, 23, 82, 12, 8 };
74             //实例化归并排序
75             MergeSortFun MSF = new MergeSortFun();
76             MSF.MergeSort(X, 0, X.Length - 1);
77             //控制台打印输出
78             foreach (int item in X)
79             {
80                 Console.WriteLine(item);
81             }
82         }
83     }
84 }

其结果与插入排序结果相同。

posted @ 2014-07-19 02:11  刘宇杰  阅读(347)  评论(0编辑  收藏  举报