我在C中编写了一个递归合并排序算法。但它没有用。
#include <stdio.h>
这是我的算法:
void mearge( int a[],int elementsOfA,int b[],int elementsOfB,int c[]){
int elementsOfC = elementsOfB + elementsOfA;
int i=0,j=0,k=0;
while(k<elementsOfC){
if(a[i]<=b[j] || j==elementsOfB) {
c[k]=a[i];
i++;
k++;
}
if(b[j]<a[i] || i==elementsOfA) {
c[k]=b[j];
j++;
k++;
}
}
}
void meargeSort(int a[], int indexOfLeft, int positionOfRight, int b[]){
if(positionOfRight-indexOfLeft==1){
b[0]=a[indexOfLeft];
}
if(positionOfRight-indexOfLeft>1){
int mid = (positionOfRight+indexOfLeft)/2;
//int left[mid-1],right[positionOfRight-mid];
int left[mid],right[positionOfRight-mid];
meargeSort(a,indexOfLeft,mid,left);
meargeSort(a,mid,positionOfRight,right);
mearge(left,mid-indexOfLeft,right,positionOfRight-mid,b);
}
}
这是我的主要功能。我给algotithm两个不同的输入:
在这两种情况下,输出都是不正确的排序
int main(int argc, char **argv)
{
int i, arr[]={5,42,31,1,-1,23,0}, brr[7];
meargeSort(arr,0,7,brr);
//int i, brr[]={-1,23,0},brr[3];
//meargeSort(arr,0,3,brr);
for(i=0;i<7;i++)
printf("%d ",brr[i]);
return 0;
}
答案 0 :(得分:1)
像
一样修复while(k<elementsOfC){
if(j == elementsOfB || i != elementsOfA && a[i] <= b[j]){//need check `i`
c[k++]=a[i++];
} else if(i == elementsOfA || b[j] < a[i]){
c[k++] = b[j++];
}
}