#include <iostream>
using namespace std;
void merge(int a[], int start, int pivot, int finish){
int *tmp = new int[finish - start +1] ;
int I = start ;
int J = pivot +1 ;
int K = 0 ;
while((I <= pivot)&& ( J <= finish) ){
if(a[I] < a[J]){
tmp[K] = a[I] ;
K++ ; I++ ;
}
else{
tmp[K] = a[J] ; K++ ; J++ ;
}
}
if(I <= pivot){
while(I <= pivot){
tmp[K++] = a[I++] ;
}
}
if( J<= finish){
while(J<= finish){
tmp[K++] = a[J++] ;
}
}
for(K = start ; K <= finish ; K++) a[K] = tmp[K-start] ;
delete []tmp ;
return ;
}
void mergesort(int a[], int start, int finish){
if(start < finish){
int pivot = (start + finish)/2 ;
mergesort(a,start, pivot) ;
mergesort(a, pivot+1, finish) ;
merge(a, start, pivot, finish) ;
}
}
int main(){
int test[] = {4} ;
mergesort(test,0, 1) ;
for(int i = 0 ; i < sizeof(test)/sizeof(int); i++) cout<<" * " << test[i] ;
cout<<endl ;
}
当我输出这个简单的测试时,它打印“* 0”。为什么零?它从何而来?该数组只包含4个!
答案 0 :(得分:1)
您已编写合并排序例程,以便start
和finish
都是数组中的有效位置,但您已使用finish
作为“过去一个”的索引调用例程结束“。
我认为您打算致电mergesort(test, 0, 0);
0
可能来自test[1]
,它不是有效索引,实际上可能包含任何内容。恰好是0
小于4
,因此您的4
将被移出阵列的末尾。这是未定义的行为。
答案 1 :(得分:0)
它应该是“mergesort(test,0,0)”。原因是:参数'finish'应该是a.length-1。
test [] = {4}; //仅声明第一个元素 试图访问测试[45],测试[100]将给出一些不好的数字 - 来自测试的“未知”部分。 基本上,我希望开始和结束有效的数字。 test.len = 1,但它的索引为零,这就是为什么它从零到零本质上 - 没有其他数字要查找; 如果我尝试访问测试[1] - 它会得到一些蹩脚的未声明数字