归并排序法

Posted 菜鸟根据地

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了归并排序法相关的知识,希望对你有一定的参考价值。

归并排序法

  • 归并排序法是将两个(或两个以上)的有序表合并成一个新的有序表。即把待排列的序列分成若干个子序列,每个子序列都是有序的,然后再把子序列合并成整体有序序列。
  • 采用分治法
  • 运用递归来完成

 

   若出现卡死现象,一般为指针,或者scanf 或者whlie的使用错误!!!!!

其正确c语言编程如下:

 1 #include<stdio.h>
 2 
 3 //归并排序法
 4 void merge(int a[],int b[],int start,int mid,int end);
 5 void merge_sort(int a[],int b[],int start,int end);
 6 int main()
 7 {
 8     int i;
 9     int s[6];
10     printf("please enter five numbers:\n");
11     for(i=1;i<6;i++)
12     {
13         scanf("%d",&s[i]);
14     }
15 
16     merge_sort(s,s,1,5);
17 
18     printf("after number:\n");
19     for(i=1;i<6;i++)
20     {
21         printf("%4d",s[i]);
22     }
23     printf("\n");
24 }
25 void merge(int a[],int b[],int start,int mid,int end)
26 {
27     int i,j,r;
28     i=start;
29     j=mid+1;
30     r=start;
31     while(i<=mid && j<=end)
32     {
33         while(a[i]>a[j])
34         {
35             b[r]=a[j];
36             r++;
37             j++;
38         }
39         while(a[i]<a[j])
40         {
41             b[r]=a[i];
42             i++;
43             r++;
44 
45         }
46 
47         while(i<=start)
48         {
49                 b[r++]=a[i++];
50         }
51         while(j<=end)
52         {
53             b[r++]=a[j++];
54         }
55 
56 
57     }
58 }
59 void merge_sort(int a[],int b[],int start,int end)
60 {
61     int i,j,d;
62     int t[20]={0};
63     i=start;
64     j=end;
65     d=(i+j)/2;
66 
67     merge_sort(a,t,i,d);
68     merge_sort(a,t,d,j);
69     merge(t,b,i,d,j);
70 
71 }

哈哈哈哈哈 ,是错的。但是为什么?

你发现了吗?

你是否明确while和if ,但是在使用的时候你是否知道其中的区别呢?

正正正确的如下所示、

 1 #include<stdio.h>
 2 
 3 //归并排序法
 4 void merge(int a[],int b[],int start,int mid,int end);
 5 void merge_sort(int a[],int b[],int start,int end);
 6 int main()
 7 {
 8     int i;
 9     int s[6];
10     printf("please enter five numbers:\n");
11     for(i=1;i<6;i++)
12     {
13         scanf("%d",&s[i]);
14     }
15 
16     merge_sort(s,s,1,5);
17 
18     printf("after number:\n");
19     for(i=1;i<6;i++)
20     {
21         printf("%4d",s[i]);
22     }
23     printf("\n");
24 }
25 void merge(int a[],int b[],int start,int mid,int end)
26 {
27     int i,k,r;
28     r=start;
29     i=start;
30     k=mid+1;
31     while(i<=mid && k<=end)
32     {
33         if(a[i]>a[k])
34         {
35             b[r]=a[k];
36             r++;
37             k++;
38         }
39         else
40         {
41             b[r]=a[i];
42             r++;
43             i++;
44         }
45     }
46     while(i<=mid)
47     {
48         b[r++]=a[i++];
49     }
50     while(k<=end)
51     {
52         b[r++]=a[k++];
53     }
54 }
55 void merge_sort(int a[],int b[],int start,int end)
56 {
57     int i,j,d;
58     int t[20]={1};
59     i=start;
60     j=end;
61     d=(i+j)/2;
62     if(i==j)
63         b[i]=a[i];
64     else
65     {
66 
67 
68         merge_sort(a,t,i,d);
69         merge_sort(a,t,d+1,j);
70         merge(t,b,i,d,j);
71     }
72 
73 }

编写程序,一定要思路清晰。正如,i、j与什么比较的区别这也有很大的区别的。心心细心!!!!!!!

以上是关于归并排序法的主要内容,如果未能解决你的问题,请参考以下文章

分治法 实现归并排序

算法与数据结构:时间复杂度——以归并排序为例

归并排序法和基数排序法

[ 数据结构 -- 手撕排序算法第六篇 ] 归并排序(上)--递归方法实现

归并排序法

排序算法之--归并排序法