归并排序上机题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验一归并排序

一、实验目的

(1)掌握归并排序算法的思想;

(2)掌握归并排序算法的程序实现。

二、实验环境

Windows 2000以上版本的操作系统,运用java或C语言实现该算法。

三、实验内容

在main函数中定义数A[]={52,49,80,36,14,58,61,23,97},调用归并排序函数MergeSort对A[]中的数据进行排序,调试并观察排序过程。

C语言实现:

1.#include

2.typedef int RecType;//要排序元素类型

3.void Merge(RecType *R,int low,int m,int high)

4.{

5.//将两个有序的子文件R[low..m)和R[m+1..high]归并成一个有序的子文件

R[low..high]

6.int i=low,j=m+1,p=0; //置初始值

7. RecType *R1; //R1是局部向量

8. R1=(RecType *)malloc((high-low+1)*sizeof(RecType));

9.if(!R1)

10. {

11.return; //申请空间失败

12. }

13.while(i<=m&&j<=high) //两子文件非空时取其小者输出到R1[p]上

14. {

15. R1[p++]=(R[i]<=R[j])?R[i++]:R[j++];

16. }

17.while(i<=m) //若第1个子文件非空,则复制剩余记录到R1中

18. {

19. R1[p++]=R[i++];

20. }

21.while(j<=high) //若第2个子文件非空,则复制剩余记录到R1中

22. {

23. R1[p++]=R[j++];

24. }

25.for(p=0,i=low;i<=high;p++,i++)

26. {

27. R[i]=R1[p]; //归并完成后将结果复制回R[low..high]

28. }

29.}

30.void MergeSort(RecType R[],int low,int high)

31.{

32.//用分治法对R[low..high]进行二路归并排序

33.int mid;

34.if(low

35. { //区间长度大于1

36. mid=(low+high)/2; //分解

37. MergeSort(R,low,mid); //递归地对R[low..mid]排序

38. MergeSort(R,mid+1,high); //递归地对R[mid+1..high]排序

39. Merge(R,low,mid,high); //组合,将两个有序区归并为一个有序区

40. }

41.}

42.void main()

43.{

44.int a[9]={52,49,80,36,14,58,61,23,97}; //这里对9个元素进行排序

45.int low=0,high=8; //初始化low和high的值

46.

47. printf("Before merge sort: ");

48.for(int i=low;i<=high;i++)

49. {

50. printf("%d ",a[i]); //输出测试

51. }

52. printf("/n");

53.

54. MergeSort(a,low,high);

55.

56. printf("After merge sort: ");

57.for( i=low;i<=high;i++)

58. {

59. printf("%d ",a[i]); //输出测试

60. }

61. printf("/n");

62.}

java实现:

public class MergeSort {

/**

* 归并排序先将初始的序列表看成是n个长度为1的有序表(1)定义指针i,指向第一个序列表的第一个元素

* (2)定义指针j,指向第二个序列表的第一个元素

* (3)比较i,j指向的元素大小,若前者大,将后者插入到新表中,否则把前者插入到后表中* (4)直到取完第一个序列表或者第二个序列表为止

*/

public static void main(String[] args) {

int[] num = {52,49,80,36,14,58,61,23,97 };

int[] num1 = new int[9];

num = mergesort(num, 0, num.length - 1, num1);

for (int i : num) {

System.out.print(i + " ");

}

}

private static int[] mergesort(int[] num, int s, int t, int[] num1) {

int m;

int[] num2 = new int[t + 1];

if (s == t)

num1[s] = num[s];

else {

m = (s + t) / 2;

mergesort(num, s, m, num2);//左半部分递归调用

mergesort(num, m + 1, t, num2);//右半部分递归调用

merg(num2, s, m, t, num1);// 由num2去归并,返回的值放到num1中,num1赋新值,//其实就是更新num2,然后让num2再去归并,返回新的num1

}

return num1;

}

//有序表的合并

private static void merg(int[] num, int l, int m, int n, int[] num1) {

System.out.print("l=" + l + " m=" + m + " n=" + n);

System.out.println();

int i, j, k;

i = l;

j = m + 1;

k = l;

while (i <= m && j <= n) {

if (num[i] < num[j])

num1[k++] = num[i++];

相关文档
最新文档