Сортировка слиянием C Неправильная сортировка

#c #arrays #sorting #merge

#c #массивы #сортировка #слияние

Вопрос:

Я пишу программу, которая будет выполнять 5 различных функций сортировки и сравнивать время между ними. Я вывожу 1000-й элемент каждого массива, чтобы проверить, правильно ли он отсортирован, все мои другие сортировки, кроме сортировки слиянием, выдают правильное число. Сортировка слиянием близка, но отключена, она находится в пределах одного или двух элементов от получения правильного ответа (вывод 25011, а не 25034 для 1000-го элемента.) Вот код для моей сортировки слиянием:

 //Zach Heesaker. CS3. Project 4
#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>
#include <stdio.h>
#include <ctime>
#include <cstdio>
#include <time.h>
#include <stdint.h>
#include<list>
#include<cmath>

using namespace std;

const int n = 10000;
int numswaps, numcompares;

void swap(intamp; a, intamp; b);
void print(int arr[], int n, ofstreamamp; outf, double time);
void read(int arr[], int size);
void mergepass(int arr[], int y[], intamp; n, intamp; L);
void mergeSort(int arr[], int n);
void merge(int arr[], int y[], int L, int m, int n);

int main()
{
    int numsorts = 5;
    string whichsort;
    ofstream outf("output.ot");
    int arr[n   1];
    clock_t start, end;
    double time;

    outf << "Sort Name: " << setw(5) << " " << "1000th Element: " << setw(1) << " " << "Number of Moves: " << setw(1) << " " << "Time taken: " << endl;
    read(arr, n);
    numcompares = 0;
    numswaps = 0;
    start = clock();
    mergeSort(arr, n);
    end = clock();
    time = double(end - start) / double(CLOCKS_PER_SEC);
}

void mergeSort(int arr[], int size)
{
    int L = 1;
    int y[n   1];
    while (L < n)
    {
        mergepass(arr, y, size, L);
        L = 2 * L;
        mergepass(y, arr, size, L);
        L = 2 * L;
    }
}

void merge(int arr[], int y[], int L, int m, int n)
{
    int i, j, k, t;
    i = L;
    k = L;
    j = m   1;
    while ((i <= m) amp;amp; (j <= n))
    {
        numcompares  ;
        if (arr[i] <= arr[j])
        {
            numswaps  ;
            y[k  ] = arr[i  ];
        }
        else
        {
            numswaps  ;
            y[k  ] = arr[j  ];
        }
    }
    if (i > m)
    {
        for (t = j; t <= n; t  )
        {
            numswaps  ;
            y[k   t - j] = arr[t];
        }
    }
    else
    {
        for (t = i; t <= m; t  )
        {
            numswaps  ;
            y[k   t - i] = arr[t];
        }
    }
}

void mergepass(int arr[], int y[], intamp; n, intamp; L)
{
    int i, t;
    i = 1;
    while (i <= n - 2 * L   1)
    {
        merge(arr, y, i, i   L - 1, i   2 * L - 1);
        i = i   2 * L;
    }
    if ((i   L - 1) < n)
    {
        merge(arr, y, i, i   L - 1, n);
    }
    else
    {
        for (t = i; t <= n; t  )
        {
            numswaps  ;
            y[t] = arr[t];
        }
    }
}

void swap(intamp; a, intamp; b)
{
    int temp;
    temp = a;
    a = b;
    b = temp;
    numswaps  = 3;
}

void print(int arr[], int n, ofstreamamp; outf, double time)
{
    outf << left  << setw(6) << " " << left  << arr[1000] << setw(12) << " " << left <<  numswaps << setw(10) << " " << left << "t" << time << endl;
}

void read(int arr[], int size)
{
    ifstream ifs("input.txt");
    int i = 0;
    while (!ifs.eof())
    {
        ifs >> arr[i];
        i  ;
    }
}

int merge(int arr[], int left, int right)
{
    int pivot = arr[right];
    int k = (left - 1);
    for (int j = left; j <= right - 1; j  )
    {
        numcompares  ;
        if (arr[j] < pivot)
        {
            k  ;
            swap(arr[k], arr[j]);
        }
    }
    swap(arr[k   1], arr[right]);
    return (k   1);
}
  

Есть идеи относительно того, что здесь происходит не так? Спасибо.

Комментарии:

1. Эта программа, как вы написали, даже не будет компилироваться.

2. @yzt Я добавил полный исходный код для пояснения, верхний код был просто функцией сортировки слиянием

3. Ваш код довольно запутанный, используйте лучшие имена переменных, а не отдельные буквы, n является одновременно глобальной переменной и аргументом функции, передает переменные в функции, а не использует глобальные переменные. Я не удивлюсь, если вы исправите все, что ваша ошибка исчезнет или станет более очевидной