2017-12-20 34 views
-1

挿入とヒープの並べ替えの2つのアルゴリズムを実行するC++プログラムを作りたいと思います。しかし、配列のサイズは、double型ではなく、整数型または列挙型でなければならないというエラーが続いています。私の間違いはどこですか?私はファイルからデータを読み込んでいます。ヒープの並べ替えと挿入の並べ替え

#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++; 
    } 
} 

また、私は矛盾した比較を数えています。

+3

"**配列のサイズは、double型ではなく、整数型または列挙型でなければなりません**" - あなたは配列のサイズを '[N]'として宣言しようとします。 'N'は' double'です。 double型の配列を持つことはできません – Fureeish

+0

間違えているのは、整数型または列挙型でなければならないときに、配列のサイズとして 'double'を使用しているということです。 – user463035818

答えて

0

迅速な解決にはどこでもあなたが添字を使用置き換えることであろう([])演算子の代わりにこれを行う:A = new double[(int)N];

私はこのことができます願っています。

+0

またはNの型をintに変更してくださいそれが宣言されているところでは、非整数型を最初から使用するのは相当な意味があるように見えます。 –

+0

@SeanBurtonも同様に動作します –

関連する問題