归并排序 求差错。。。。。。
- C/C++ code
#include <stdio.h>#include <stdlib.h>void merge(int *array,int *tmp,int start,int center,int end)//合并的程序。这里无错。{ int i=0; while(start<=center-1&¢er<=end) { if(array[start]<=array[center]) tmp[i++] = array[start++]; else if(array[start]>=array[center]) tmp[i++] = array[center++]; } while(start<=center-1) tmp[i++] = array[start++]; while(center<=end) tmp[i++] = array[center++]; for(i=0;i<=end;i++) array[i] = tmp[i];}void MergeSort(int *a,int *tmp,int start,int end){ if(start<end) { int center = (start+end)/2 + 1;//第二个部分的开始 MergeSort(a,tmp,start,center-1); MergeSort(a,tmp,center,end); merge(a,tmp,start,center,end); }}int main (){ int a[10] = {1,3,6,7,9,0,2,4,5,8}; int tmp[10]; MergeSort(a,tmp,0,9); for(int i=0;i<10;i++) printf("%d ",a[i]); return 0;}始终不知道错误在哪个地方。。。 求助高人。。。
[解决办法]
- C/C++ code
#include <stdio.h>#include <stdlib.h>void merge(int *array,int *tmp,int start,int center,int end){ int j = 0;// int i = 0;// int k = 0;// int c = center;// int s = start;//楼主的程序里start和center两个变量都会变的,而第二个while循环里程序又要用start和center的原值。 while(start<=c-1&¢er<=end)// { if(array[start]<=array[center]) tmp[i++] = array[start++]; else if(array[start]>array[center]) tmp[i++] = array[center++]; } while(start<=c-1)//这儿不能再用center了,因为center已经不是楼主想象中的center了。。 tmp[i++] = array[start++]; while(center<=end) tmp[i++] = array[center++]; for(j = s;j<=end && k < i;j++, k++)//j不能从0开始,而要从start开始。 array[j] = tmp[k];}void MergeSort(int *a,int *tmp,int start,int end){ if(start<end) { int center = (start+end)/2 + 1; MergeSort(a,tmp,start,center-1); MergeSort(a,tmp,center,end); merge(a,tmp,start,center,end); }}int main (){ int a[10] = {1,3,6,7,9,0,2,4,5,8}; int tmp[10]; MergeSort(a,tmp,0,9); for(int i=0;i<10;i++) printf("%d ",a[i]); return 0;}