归并排序的go语言与C++实现对比

最近对go语言发生了兴趣,发现go语言语法简洁,非常适合算法的描述和实现,于是对归并排序进行了实现。

例子中需要排序的队列是长度为100的从100到1的数列,排序算法是正序排序,排序正确的话,结果应当为1到100。

因为已设定数组最大值为100,因此“哨兵”简略设置为1000,因为不是算法核心部分,此处“哨兵”最大值处理省略。

 1 /*
 2 归并排序的go语言实现
 3 */
 4 package main
 5
 6 import fmt "fmt"
 7
 8 func main () {
 9     /*
10     生成需要排序的队列100~1
11     */
12     length:=100
13     A:=make([]int,length)
14     j:=length
15     for i:=0;i<length;i++{
16         A[i]=j
17         j--
18     }
19     /*
20     排序
21     */
22     MergeSort(A,0,length-1)
23     /*
24     输出排序后的队列
25     */
26     for i:=0;i<length;i++{
27         fmt.Println(A[i])
28     }
29 }
30 /*
31 归并排序
32 */
33 func MergeSort(Arrary []int,p int,r int) {
34
35     if p<r {
36         q:=0
37         if(r-q+1)%2==0{
38             q=(p+r-1)/2
39         }else{
40             q=(p+r)/2
41         }
42
43         MergeSort(Arrary,p,q)
44         MergeSort(Arrary,q+1,r)
45         Merge(Arrary,p,q,r)
46     }
47 }
48 /*
49 两列已排序的数组合并
50 */
51 func Merge(Arrary []int,p int,q int,r int) {
52     n1:=q-p+1
53     n2:=r-q
54
55     L_Arr:=make([]int,(n1+1))
56     R_Arr:=make([]int,(n2+1))
57
58     for i:=0;i<n1;i++{
59         L_Arr[i]=Arrary[p+i]
60     }
61     L_Arr[n1]=1000;
62
63     for i:=0;i<n2;i++{
64         R_Arr[i]=Arrary[q+1+i]
65     }
66     R_Arr[n2]=1000;
67     iLnum:=0
68     iRnum:=0
69     for i:=p;i<r+1;i++{
70         if L_Arr[iLnum]<R_Arr[iRnum] {
71             Arrary[i]=L_Arr[iLnum]
72             iLnum++
73         }else{
74             Arrary[i]=R_Arr[iRnum]
75             iRnum++
76         }
77     }
78 }

C++实现

 1 #include <iostream>
 2 using namespace std;
 3 void MergeSort(int *,int ,int);
 4 void Merge(int *, int, int,int);
 5 int main(void)
 6 {
 7        //生成需排列的数组
 8     int length=100;
 9     int *A=new int[length];
10     for(int i=0,j=length;i<length;i++,j--)
11     {
12         A[i]=j;
13     }
14     MergeSort(A,0,length-1);
15     for(int i=0;i<length;i++)
16     {
17         cout<<A[i]<<" ";
18     }
19     return 0;
20 }
21 /*
22 A[p...r]
23 */
24 void MergeSort(int *A,int p,int r)
25 {
26     if(p<r)
27     {
28         int q=0;
29                 //q要取地板,不然在q+1时会溢出
30         if((r-q+1)%2==0)
31         {
32             q=(p+r-1)/2;
33         }
34         else
35         {
36             q=(p+r)/2;
37         }
38         MergeSort(A,p,q);
39         MergeSort(A,q+1,r);
40         Merge(A,p,q,r);
41     }
42 }
43 /*
44 A[p...q],A[q+1...r]
45 */
46 void Merge(int *A,int p,int q,int r)
47 {
48     int n1=q-p+1;
49     int n2=r-q;
50
51     int *L_Arr=new int[n1+1];
52     int *R_Arr=new int[n2+1];
53     for(int i=0;i<n1;i++)
54     {
55         L_Arr[i]=A[p+i];
56     }
57     L_Arr[n1]=1000;
58     for(int i=0;i<n2;i++)
59     {
60         R_Arr[i]=A[q+1+i];
61     }
62     R_Arr[n2]=1000;
63     int iLnum=0;
64     int iRnum=0;
65     for(int i=p;i<r+1;i++)
66     {
67         if(L_Arr[iLnum]<R_Arr[iRnum])
68         {
69             A[i]=L_Arr[iLnum];
70             iLnum++;
71         }
72         else
73         {
74             A[i]=R_Arr[iRnum];
75             iRnum++;
76         }
77     }
78 }
时间: 2024-07-28 16:17:04

归并排序的go语言与C++实现对比的相关文章

c++和c语言的inline关键字对比

其实我一直比较喜欢C语言,对C++的了解少之又少,但是最近由于需要翻看起C++的书籍来.在C++沉思录当中,看到了这样一句话:“我还指出,由于这些成员函数定义在Trace类自身的定义内,C++会内联扩展它们,所以就使得即使在不进行跟踪的情况下,在程序中保留Trace对象也不必付出许多代价.——Koenig,<C++沉思录中文版>,page2”.K先生所举例的代码如下所示: 1 class 2 Trace{ 3 public : 4 Trace(){noisy = 0;} 5 void prin

快速排序和归并排序(C语言)

1.0快速排序算法 (1)分解 (2)递归求解 (3)合并 int partition(int a[],int p,int r) { int i=p,j=r+1; int x=a[p]; int temp; while(1)  //将<x的元素交换到左边元素,>x的元素交换到右边元素 { while(a[++i]<x && i<r); while(a[--j]>x); if(i>=j) break; temp=a[i]; a[i]=a[j]; a[j]=

归并排序(C语言实现)

合并排序(MERGE SORT)是又一类不同的排序方法,合并的含义就是将两个或两个以上的有序数据序列合并成一个新的有序数据序列,因此它又叫归并算法. 它的基本思想就是假设数组A有N个元素,那么可以看成数组A是又N个有序的子序列组成,每个子序列的长度为1,然后再两两合并,得到了一个 N/2 个长度为2或1的有序子序列,再两两合并,如此重复,值得得到一个长度为N的有序数据序列为止,这种排序方法称为2—路合并排序. 例如数组A有7个数据,分别是: 49 38 65 97 76 13 27,那么采用归并

几种常见语言的基本语法对比:字符串

c++: 一段时间不写c++.简直又是忘光了.而其他语言几年不写.几个小时就回想起来了.还是c++太难了.各种用法.学的时候就没学明白. 写代码的时候,一直回想 ,如这个参数,是否用常引用.  vecotr是如何实现的?string是如何实现的.string[] 堆栈是如何放的. 只要涉及到堆.基本不用写代码了.一头郁闷包,算了c++.永别了.例子都不 敢写完.随便写下吧. #include <iostream> #include <vector> using namespace

几种常见语言的基本语法对比:数字处理

c++: 在不涉及到内存管理下,总体感觉很爽,又因为是unix自带编译器.非常爽.唯一一点就是枚举类型中的枚举值是好像是全局变量名.搞得枚举值命名很长. 语法基本没有太多停顿 ,这个例子中所涉及的语法部分和c#,java 很像. #include <iostream> using namespace std; enum enum_op { enum_op_add, enum_op_minus, enum_op_time, enum_op_divide }; int NumberCaculate

JAVA语言对比C++语言的几个优点和自身的关键特性

之所以写这篇博客不是为了比较JAVA语言和C++语言到底孰优孰劣,而是从语言本身出发进行对比总结程序编码设计上的差别.因水平有限,某些内容可能太过片面,欢迎指正和讨论. JAVA语言在设计上很好地借鉴了C++语言,是一种完全“面向对象”的编程语言.JAVA语言的语法与C++语言的结构语法非常相似,这使得C++程序猿学习JAVA变得非常容易. JAVA语言的最大优点就是“Wirte Once,Run Everywhere”,就是“一次编写,到处运行”的意思.JAVA语言相对C++来说,增加了一些新

我是黑马-----OC与C语言的区别

C语言是面向过程的编程语言,而OC则是面向对象的编程语言. 面向对象:打个比方,就是你做一次菜,让老婆做个菜,吃饭,这就是面向对象,效率高 面向过程,就是每一个细节:比如你要先把或开到合适的位置.然后还要洗菜 ,等油热了,才能开始炒菜,然后调料,...,起锅,到碗里,吃饭.... 面向对象编程的代码更容易维护.它把具体的操作细节封装在类里,用的时候创建个对象,一顿调用方法,搞定!(当然类的实现方法还是需要自己写,面向对象只是一种编程思想.) OC继承.或者说是拓展于C语言,OC里可以直接写C语言

【绝对干货】Swift是花拳绣腿吗?从Swift谈开发语言与程序员的职业发展

Swift是一种新的编程语言,用于编写 iOS 和 OS X 应用.Swift 结合了 C 和 Objective-C 的优点并且不受C兼容性的限制.Swift 采用安全的编程模式并添加了很多新特性,这将使编程更简单,更灵活,也更有趣.我们的腾讯Bugly移动开发者沙龙第二期就是围绕这一主题展开的,很多同学表示听的不够过瘾,因此小编特意邀请分享者将精华整理成文字,来于大家分享. 首先我们考察一下Swift究竟是一个什么样的变成语言.在2014年苹果的WWDC(世界开发者大会)上,Swift首次亮

快速排序,归并排序,堆排序python实现

快速排序的时间复杂度最好情况下为O(n*logn),最坏情况下为O(n^2),平均情况下为O(n*logn),是不稳定的排序 归并排序的时间复杂度最好情况下为O(n*logn),最坏情况下为O(n*logn),平均情况下为O(n*logn),是稳定的排序 堆排序的时间复杂度最好情况下为O(n*logn),最坏情况下为O(n*logn),平均情况下为O(n*logn),是不稳定的排序 1.快速排序 快速排序的介绍以及C语言实现在这里:快速排序C语言实现 本文介绍的是快速排序python实现: de