归并排序上机题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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++];