以合并排序确定侧阵列的大小

Deciding the size of the side array in merge sort

本文关键字:阵列 合并 排序      更新时间:2023-10-16

我正在尝试实现合并排序。我的代码有效

void merge( int * , int  , int  , int  );
void mergeSort( int *arr , int low , int high){
    if( low < high){
        int mid = ( low + high )/2;
        mergeSort( arr  , 0 , mid );
        mergeSort( arr  , mid +1, high);
        merge( arr , low , mid , high);
    }
}
void merge( int *arr , int low , int mid , int high ){

    int barr[ high  ];
    int i     = low;
    int j     = mid + 1;
    int index = low;
    while( i <= mid  && j <= high ){
        if( arr[i] < arr[j] ){
            barr[index++] = arr[i++];
        }
        else{
            barr[index++] = arr[j++];
        }
    }
    if( i < mid + 1 )
        for( int x = i ; x < mid +1 ; x++)
            barr[ index++ ] = arr[x];
    if( j <= high )
        for( int y = j ; y < high ; y ++)
            barr[ index++ ] = arr[y];
    for( int z = low ; z < index ; z++ ){
        arr[z] = barr[z];
    }
}
int main()
{
    int arr[] = { 5 ,6 , 2, 6 ,7 , 5 ,8 ,9};
    mergeSort(arr , 0 , 8 );
    for( int i = 0; i < 8 ; i++){
        cout << arr[i] << " ";
    }
    return 0;
}

我很难决定的是这条线

int barr[high]; 

如何有效地确定此侧阵列的大小?我以为高 - 低是足够的,但看起来还不够,当我创建尺寸1的arrary时,我会访问较大索引上的元素。有什么方法可以做出决定,或者我必须始终创建一个高元素的数组,从而导致大量内存消耗=我的代码无效。

谢谢

正如注释中指出的那样,VLA在C 中无效。至于您的问题,如果您想将一部分数组与lowhigh的索引合并,则需要high - low + 1数组大小。