主页 > 程序人生 > 归并排序,比较好理解的一种排序

归并排序,比较好理解的一种排序

所谓的归并排序,就是递归“把数组从中间分开,分成两段,然后分别排序,最后合并”这个过程。

比较好理解,所以很快敲出了代码。

比快排好理解。。。个人感觉。。。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include<stdio.h>
#include<stdlib.h>
typedef int mytype;
void add(mytype *a,int l1,int h1,int l2,int h2)
{
	mytype *t;
	int i,j,k;
	i=l1;
	j=l2;
	k=0;
	t=(mytype*)malloc((h2-l1+1)*sizeof(mytype));
	//申请空间存放中间数据
	while(i<=h1&&j<=h2)
	{
		if(a[i]<a[j])
		{
			t[k++]=a[i++];
		}else
		{
			t[k++]=a[j++];//小的放进去。。。
		}
	}
	while(i<=h1)
	{
		t[k++]=a[i++];
	}
	while(j<=h2)
		t[k++]=a[j++];//多余的数
	for(i=l1,j=0;i<=h2;i++,j++)
	{
		a[i]=t[j];//复制中间数据回去
	}
	free(t);
	return ;
}
void MergeSort(mytype *a,int low,int high)
{
	int mid=(low+high)/2;
	if(low<high)
	{
		MergeSort(a,low,mid);//最难理解的部分了吧。。。
		MergeSort(a,mid+1,high);//就是不断的递归
		add(a,low,mid,mid+1,high);//然后从最底一层排序后回溯上来。。。
 
	}
	return ;
 
}
int main()
{
 
	mytype s[100];
	int i,j,k,n;
	while(scanf("%d",&n)!=EOF)
	{
		for(i=0;i<n;i++)
		{
			scanf("%d",s+i);
		}
		MergeSort(s,0,n-1);
		for(i=0;i<n;i++)
		{
			printf("%d ",s[i]);
		}
		puts("");
	}
}

相关日志

, , , , , , ,

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

引用:0

下面所列的是引用到本博客的链接
归并排序,比较好理解的一种排序 来自 混沌的云
顶部