我受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];
}
问题出在哪里? 请帮我。 谢谢。
答案 0 :(得分:0)
感谢大家的评论。我发现了错误。 在sortSubVector函数中,在middle1变量中,我计算(高-低)/ 2 但是在high = 3和low = 2的情况下,我获得了错误的索引,并且收到了分段错误错误。我修复了计算middle1 =(low + high)/ 2的问题,现在可以了!
感谢您,我学会了使用调试器查找错误,非常感谢!
答案 1 :(得分:0)
感谢您的科学好奇心,但无需实施个人分类算法(除非您有很好的具体理由这样做)。
这是一个更像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::vector
和std::array
。std::sort
。using namespace std
Clean Code
中)仅对变量使用英语命名。因此,请使用vec
而不是意大利语的vettore
。答案 2 :(得分:0)
我这样做是为了了解合并排序的工作原理,因为它是通过考试所必需的。我知道std库中存在算法,我是通过书中学到的。我使用意大利语名称是因为我是意大利语(是的,是地方性的和愚蠢的东西),但是我只需要像你说的那样学习使用英语单词