堆排序和插入排序

问题描述 投票:-1回答:1

我想制作一个运行两种算法的c ++程序 - 插入和堆排序。但我一直得到一个错误,数组大小必须具有整数或枚举类型,而不是双倍。我的错误在哪里?我正在从文件中读取数据。

#include "stdafx.h"

#include <stdio.h>
#include <tchar.h>
#include <random>
#include <fstream>
#include <iostream>
#include <algorithm>
#include <time.h>

void generuoti(int _N, const char *_file);
void nuskaityti(const char *_file);

void sortInsertion(double A[], int N);

void heapSort(double A[], int N);
void heapify(double A[], int N, int i);

using namespace std;

double *Data;
double* A;
double* B;

double* A1;
double* B1;
double N;

unsigned long int palyginimai1 = 0;
unsigned long int priskyrimai1 = 0;

unsigned long int palyginimai2 = 0;
unsigned long int priskyrimai2 = 0;

int main()
{
    srand(time(NULL));
    cout << "generuojame atsitktinius duomenis ..." << endl;
    generuoti(106000, "duom.txt");
    cout << "nuskaitome duomenis ..." << endl;
    nuskaityti("duom.txt");
    A = new double[N];
    B = new double[N];

    A1 = new double[N];
    B1 = new double[N];
    for (int i = 0; i < N; i++) {
        A[i] = Data[i];
    }

    //cout << "Heap array:" << endl;
    for (int i = 0; i < N; i++)
        //cout << A[i] << " ";
    //cout << endl;

    //cout << "Insertion array: " << endl;
    for (int i = 0; i < N; i++)
    {
        B[i] = A[i];
        //cout << B[i] << " ";
    }

    for (int i = 0; i < N; i++)
    {
        A1[i] = A[i];
        B1[i] = B[i];
    }
    //cout << endl;
    int nUntil = 2000;
    while (nUntil <= 106000)
    {
        sortInsertion(B1, nUntil);
        heapSort(A1, nUntil);
        cout << priskyrimai1 << endl;
        nUntil = nUntil * 2;

        for (int i = 0; i < N; i++)
        {
            A1[i] = A[i];
            B1[i] = B[i];
        }


        //cout << nUntil << palyginimai2 << " " << priskyrimai2 << endl;
    }


    /*cout << "Surusiuota skaiciu seka Heap:" << endl;
    for (int i = 0; i < N; i++)
        cout << A1[i] << " ";
    cout << endl;

    cout << "Surusiuota skaiciu seka Insertion:" << endl;
    for (int i = 0; i < N; i++)
        cout << B1[i] << " ";
    cout << endl;*/




    system("pause");
    return 0;
}

void generuoti(int _N, const char *_file) {
    ofstream os(_file);
    os << _N << endl;
    for (int i = 0; i < _N; i++)
    {
        os << " " << (double)(rand() % 1001) / (double)1000;
    }
    //os << " " << (double)13 << " " << (double)18 << " " << (double)25 << " " << (double)2 << " " << (double)6 << " " << (double)11 << " " << (double)16 << " " << (double)1 << " " << (double)6 << " " << (double)21 << " " << (double)17;
    os.close();
}

void nuskaityti(const char *_file) {
    ifstream is(_file);
    if (is.fail()) {
        cout << "failo nera" << endl;
        exit(1);
    }
    is >> N;
    Data = new double[N];
    for (int i = 0; i < N; i++) {
        is >> Data[i];
    }
}

void sortInsertion(double A[], int N) {
    double temp;
    int hole;

    for (int i = 1; i < N; i++)
    {
        palyginimai1++;
        temp = A[i];
        hole = i;
        while (hole > 0 && A[hole - 1] > temp)
        {
            palyginimai1++;
            A[hole] = A[hole - 1];
            priskyrimai1++;
            hole--;

        } 
        priskyrimai1++;
        A[hole] = temp;
    } 
}

void heapify(double A[], int N, int i)
{
    int largest = i;
    int l = 2 * i + 1;
    int r = 2 * i + 2;
    priskyrimai2 = priskyrimai2 + 3;

    if (l < N && A[l] > A[largest])
    {
        largest = l;
        priskyrimai2++;
    }

    if (r < N && A[r] > A[largest])
    {
        largest = r;
        priskyrimai2++;
    }


    if (largest != i)
    {
        swap(A[i], A[largest]);
        heapify(A, N, largest);
        palyginimai2++;
        priskyrimai2++;
    }
}

void heapSort(double A[], int N)
{
    for (int i = N / 2 - 1; i >= 0; i--)
    {
        heapify(A, N, i);
        palyginimai2++;
    }


    for (int i = N - 1; i >= 0; i--)
    {
        swap(A[0], A[i]);
        priskyrimai2++;
        heapify(A, i, 0);
        palyginimai2++;
    }
}

另外,我正在计算比较 - 比较,作业 - 作业。

c++ algorithm sorting heapsort
1个回答
0
投票

一个快速的解决方案是替换你使用下标([])运算符的任何地方代替:A = new double[(int)N];

我希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.