合并排序给我没有输出

时间:2018-09-17 09:54:30

标签: c++ mergesort

我受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];
 }

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

3 个答案:

答案 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::vectorstd::array
  • 使用标准库提供的算法,例如std::sort
  • 请勿使用using namespace std
  • 鲍勃·马丁(Bob Martin)建议(在他的书Clean Code中)仅对变量使用英语命名。因此,请使用vec而不是意大利语的vettore

答案 2 :(得分:0)

我这样做是为了了解合并排序的工作原理,因为它是通过考试所必需的。我知道std库中存在算法,我是通过书中学到的。我使用意大利语名称是因为我是意大利语(是的,是地方性的和愚蠢的东西),但是我只需要像你说的那样学习使用英语单词