插入排序与归并排序的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 }

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

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

时间: 2024-11-10 22:14:36

插入排序与归并排序的C#实现的相关文章

疯狂的Java算法——插入排序,归并排序以及并行归并排序

从古至今的难题 在IT届有一道百算不厌其烦的题,俗称排序.不管是你参加BAT等高端笔试,亦或是藏匿于街头小巷的草根笔试,都会经常见到这样一道百年难得一解的问题. 今天LZ有幸与各位分享一下算法届的草根明星,排序届的领衔大神——插入排序以及归并排序.最后,在头脑风暴下,LZ又有幸认识了一位新朋友,名叫并行归并排序.接下来,咱们就一一认识一下,并且在最后来一次“算林大会”吧. 插入排序简介 插入排序,算林称最亲民的排序算法,插入排序采用最简单的插入方式对一个整数数组进行排序.它循环数组中从第二个开始

插入排序和归并排序的实现代码(C++)

插入排序和归并排序是算法导论先讲到的两中排序方法. 插入排序的思路是对于一个已经排好序的数组,现在新插入一个元素并且保持其有序.那么该如何插入呢,从数组最后一个元素开始进行比较,直到遇到比小于等于自己的元素,然后插入到该元素的后面(所以插入是稳定的).循环不变式:子数组一直保持有序(使用循环不变式来证明算法正确性的方法类似于高中经常用的数学归纳法). 归并排序的思想就是很有名的分治思想(divide and conquer).从较小的多个有序数组得到较大的有序数组即合并,归并排序采用二路归并.多

基本排序算法(冒泡排序 选择排序 插入排序 快速排序 归并排序 基数排序 希尔排序)

冒泡排序 public static void bubbleSort(int[] arr){ int lgn = arr.length; for (int i = 0; i < lgn - 1; i++) { for (int j = 0; j < lgn - 1 - i; j++) { if(arr[j] > arr[j + 1]){ int temp = arr[j + 1]; arr[j + 1] = arr[j]; arr[j] = temp; } } } } 选择排序 publ

插入排序与归并排序

前言: 排序算法应该算是算法入门级的东西了,这里重新学习算法,先暂时归纳下个人对两种算法的理解. 插入排序: 插入排序可以对应到现实生活中的排队去停车场停车的场景.假设某家饭店的饭菜十分好吃(流口水),导致来这里吃饭的人特别多,后面来吃饭准备停车的车排起了长队.每次只允许一辆车过去找位置,找到位置之后才允许下一辆车进入,依此类推,直到所有的车都停好.转换成专业的数学模型就是:现有一个无序数组 A[n],要想对其进行排序.我们先从一个数开始考虑,A0肯定是排好序的.现在假设有A1,那么这时候应该将

插入排序和归并排序

//插入排序 //C++ #include <iostream> using namespace std; void main() { int a[6]={5,2,4,6,1,3};//定义一个未排好序的数组 int i,j,key; for(i=0;i<6;i++)//输出排序前的序列 printf("%3d",a[i]); for(j=1;j<6;j++) { key=a[j]; i=j-1; while(i>=0&&a[i]>k

冒泡排序,插入排序,归并排序,快速排序的学习笔记

这几个很基础的排序非常有用,我重新整理了下代码 1 #include<iostream> 2 #include<algorithm> 3 4 using namespace std; 5 6 void Bouble_Sort(int * Arry,int Lenth) //冒泡排序 7 { 8 int i,k; 9 10 int flag = 0; 11 12 for(i = Lenth - 1;i >= 0; i--) 13 { 14 for(k=0;k<i;k++)

算法导论笔记1 - 插入排序 vs 归并排序

import random import time __author__ = 'Administrator' LENGTH = 3000 base = [] for i in range(0, LENGTH): base.append(random.randint(0, LENGTH)) def ins_sort(array): for border in range(1, len(array)): j = border - 1 key = array[border] while j >= 0

算法导论之插入排序和归并排序

一.创建我们的测试工程 因为我们只理解相应算法,没有什么用户图形,也就用不到UI了,在这儿使用Xcode创建一个基于Mac开发的控制台工程即可,整个工程很简单,一个main函数一个排序类,如下所示. 在Sort类中我们写了关于排序的一些类方法,然后在main函数中进行调用. 二.插入排序 插入排序顾名思义,就是把无序的元素插入到有序的元素当中.<算法导论>中举了一个特为形象的例子,插入排序就如同你在打扑克时摸牌一样,手里的牌是有序的,而你刚摸得牌是是随机的,需要你插入到已经排好序的扑克牌中,这

算法导论-排序-插入排序、归并排序

目录: 1.插入排序算法伪码 2.插入排序c++实现 3.归并排序算法伪码 4.归并排序c++实现 5.总测试程序 内容: 1.插入排序算法伪码 Insertion_sort(A[],n) //数组下标从1开始 for j <- 2 to n do key <- A[j] i <- j-1 while i>0 and A[i]>key A[i+1] <- A[i] i <- i-1 A[i+1]=key 2.插入排序c++实现 1 template<type