zoukankan      html  css  js  c++  java
  • 插入排序与归并排序的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 }

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

  • 相关阅读:
    leetCode 78.Subsets (子集) 解题思路和方法
    大话设计模式C++版——代理模式
    不用加减乘除做加法
    hdu 1257
    小学生算术
    字符串排序问题
    POJ 2421 Constructing Roads
    http://vdceye.com/ 全新页面上线
    POJ3262 Protecting the Flowers 【贪心】
    集群环境下JSP中获取客户端IP地址的方法
  • 原文地址:https://www.cnblogs.com/LiuYujie/p/3854513.html
Copyright © 2011-2022 走看看