归并排序法
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与什么比较的区别这也有很大的区别的。心心细心!!!!!!!
以上是关于归并排序法的主要内容,如果未能解决你的问题,请参考以下文章