简体   繁体   English

合并排序问题,在方法之间传递数组?

[英]Merge Sort Issue, passing array between methods?

I am writing a program that implements the quicksort, insertion sort, and merge sort. 我正在编写一个实现快速排序,插入排序和合并排序的程序。 I can get all working except the merge sort and I can not figure out why. 我可以得到所有工作,除了合并排序,我无法弄清楚为什么。 Please ignore the operation and comparison variables. 请忽略操作和比较变量。 They are so I can analyze the runtime and number of operations for different input files. 它们是如此我可以分析不同输入文件的运行时和操作数。 This code is run from the main through a class object in this fashion: 此代码以这种方式从main通过类对象运行:

Merge testobj13(test_Med[0], 100);
    testobj13.merCall();
    testobj13.display();

For a sorted list the class keeps the list sorted, for a reversed list the list still pretty much stays reversed except for the first and last values, for a randomized list I cannot see any pattern between the output and the original input. 对于排序列表,类保持列表排序,对于反转列表,列表仍然几乎保持反转,除了第一个和最后一个值,对于随机列表,我看不到输出和原始输入之间的任何模式。 I will be attempting to answer other questions while I wait for an answer. 在等待答案的时候,我会尝试回答其他问题。 Any criticism is welcome even if it is just about my code or syntax not relating to the overall issue here. 任何批评都是受欢迎的,即使它只是关于我的代码或语法与这里的整体问题无关。 I wrote this code based off of a sudo code written by my algorithms class so Iam having trouble finding out what is wrong here. 我根据我的算法类编写的sudo代码编写了这段代码,所以我很难找到错误。

# include <iostream>
# include <stdio.h>
# include <stdlib.h>

using namespace std;
class Merge{
public:
    int comparisons, operations, middle, i, j, k, size;
    int *myArray, *c;

Merge::~Merge(){
    myArray = 0;
    delete myArray; 
}

Merge::Merge(int a [], int n) {
    size= n;
    myArray= new int[size];
    comparisons = 0, operations = 0, middle = 0, i = 0, j = 0, k = 0;

    for(int x = 0; x < size; x++){
       myArray[x] = a[x];
    }
}

void combine(int arr [], int first, int middle, int last){

i = first, j = middle + 1, k = first; operations = operations + 3;
c = new int[last + 1]; operations ++;

while( (i <= middle) && (j <= last) ){
    comparisons++;operations++;
    if(arr[i] <= arr[j]){operations++;
        c[k] = arr[i]; operations++;
        i++; operations++;
    }
    else{
        c[k] = arr[j]; operations++;
        j++; operations++;
    }
    k++; operations++;
}
while(i <= middle){operations++;
    c[k] = arr[i]; operations++;
    i++; operations++;
    k++; operations++;
}
while(j <= last){operations++;
    c[k] = arr[j]; operations++;
    j++; operations++;
    k++; operations++;
}
for(int k = first; k <= last; k++){operations++;
    arr[k] = c[k]; operations++;
}
c = 0;
delete c;
}

void mer(int arr [], int first, int last){
operations++; //for the comparison in the following if statement
if ( first < last ){
    middle = (first + last) / 2; operations++;
    mer(arr, first, middle);  operations++;
    mer(arr, middle + 1, last); operations++;
    combine(arr, first, middle, last); operations++;
}
}

void merCall(){
mer(myArray, 0, size - 1);
}

void display(){

cout << "The array after going through Merge Sort: " ;

for(int x = 0; x < size; x++){
    cout << endl << myArray[x];
}

cout << endl << "Number of operations :" << operations << "\t comparisons: " <<   comparisons << endl;

}


};

Your "middle" variable is being overwritten during the recursion because it is a class member instead of a local variable: 您的“中间”变量在递归期间被覆盖,因为它是类成员而不是局部变量:

middle = (first + last) / 2; operations++;

// This is going to affect middle
mer(arr, first, middle);  operations++;

// So this isn't going to work on the range you think it is.
mer(arr, middle + 1, last); operations++;

combine(arr, first, middle, last); operations++;

It would be better to declare middle as a local variable: 将middle声明为局部变量会更好:

int middle = (first + last) / 2; operations++;
mer(arr, first, middle);  operations++;
mer(arr, middle + 1, last); operations++;
combine(arr, first, middle, last); operations++;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM