合并排序没有给我任何输出

Merge Sort give me no output

本文关键字:任何 输出 排序 合并      更新时间:2023-10-16

我写了这个合并排序代码,灵感来自Deitel书(它使用类(。 当我编译代码(没有错误(时,我得到了未排序数组的输出,但第二个输出没有出现,就像它忽略了那部分代码一样。 程序正常终止。

这里的代码:

#include <iostream>
using namespace std;
void mergeSort(int*, int);

int main()
{
const int DIM = 20;
int vettore[DIM] = { 5, 10, 45, 214, 2, 14, 65, 87, 30, 21, 1, 24, 97, 
35, 64, 82, 14, 32, 98, 2};

for(int i = 0; i < DIM; i++)
cout << vettore[i] << ' ';
cout << endl;
mergeSort(vettore, DIM);
for(int i = 0; i < DIM; i++)
cout << vettore[i] << ' ';
return 0;
}
void sortSubVector(int*, int, int, int); //prototipo
void mergeSort(int* vec, int dim)
{
sortSubVector(vec, dim, 0, dim-1);
}
void merge(int*, int, int, int, int, int); //prototipo
void sortSubVector(int* vec, int dim,  int low, int high)
{
if((high - low) >= 1 )
{
int middle1 = (high - low) / 2;
int middle2 = middle1 + 1;
sortSubVector(vec, dim, low, middle1);
sortSubVector(vec, dim, middle2, high);
merge(vec, dim, low, middle1, middle2, high);
}
}

void merge(int* vec, int dim, int left, int middle1, int middle2, int right)
{
int leftIndex = left;
int rightIndex = middle2;
int tempIndex = left; //indice vettore temporaneo
int tempVector[ dim ]; //qui verranno posizionati gli elementi ordinati
while(leftIndex <= middle1 && rightIndex <= right)
{
if(vec[leftIndex] <= vec[rightIndex])
tempVector[tempIndex++] = vec[leftIndex++];
else
tempVector[tempIndex++] = vec[rightIndex++];
}
/* gli elementi di una metà sono stati tutti posizionati in ordine, ma 
mancano gli elementi dell'altra metà */ 
if(leftIndex == middle2) //la prima metà è stata completata
while(rightIndex <= right)
tempVector[tempIndex++] = vec[rightIndex++];
else                    //la seconda metà è stata completata
while(leftIndex <= middle1)
tempVector[tempIndex++] = vec[leftIndex++];
/*il vettore temporaneo è pieno e ordinato. Copiamolo nel vettore 
originale*/
for(int i = 0; i < dim; i++)
vec[i] = tempVector[i];
}

问题出在哪里? 请帮助我。 谢谢。

感谢您的评论。我发现了错误。 在排序子向量函数中,在中间 1 个变量中我计算(高 - 低(/2 但是在高 = 3 和低 = 2 的情况下,我获得了错误的索引,并且收到分段错误。我修复了它计算中间 1 =(低 + 高(/2,现在它可以工作了!

多亏了你,我学会了使用调试器来查找错误,非常感谢!

我很欣赏你的科学好奇心,但没有必要实现个人排序算法(除非你有很好的具体理由这样做(。

这是一个更像 c++ 的实现

#include <iostream>
#include <array>
#include <algorithm>
template <typename T>
void print(const T& array) {
for (const auto& item : array) {
std::cout << item << ' ';
}
std::cout << std::endl;
}
int main() {
const int DIM = 20;
std::array<int, DIM> vec = {5, 10, 45, 214, 2, 14, 65, 87, 30, 21, 1, 24, 97, 35, 64, 82, 14, 32, 98, 2};
print(vec);
std::sort(vec.begin(), vec.end());
print(vec);
return 0;
}

请考虑以下几点

  • 使用标准库提供的容器,如std::vectorstd::array
  • 使用标准库提供的算法,例如std::sort.
  • 不要使用using namespace std
  • 鲍勃·马丁建议(在他的书Clean Code中(只使用英文命名变量。因此使用vec而不是意大利vettore

我这样做是为了学习合并排序的工作原理,因为它需要通过我的考试。我知道存在标准库的算法,我从我的书中学到了这一点。我用了意大利名字,因为我是意大利人(是的,locic和愚蠢的东西(,但我必须学会像你说的那样只使用英语单词