2017-12-20 26 views
-1

두 개의 알고리즘 (삽입 및 힙 정렬)을 실행하는 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++; 
    } 
} 

또한, 나는 palyginimai을 믿는다 - 비교, priskyrimai-할당.

+3

"** 배열 크기는 두 배가 아닌 정수형 또는 열거 형이어야합니다 **"- 음, 배열의 크기를'[N]'으로 선언하려고합니다. 반면에'N'은'double'입니다. 당신은'double' 크기의 배열을 가질 수 없습니다 – Fureeish

+0

실수는 여러분이 정수형 또는 열거 형이어야 할 때 배열 크기로'double'을 사용한다는 것입니다 ... – user463035818

답변

0

빠른 솔루션은 어디서나 첨자를 사용하여 교체하는 것 ([]) 연산자 대신 이렇게 : A = new double[(int)N];

도움이 되었기를 바랍니다.

+0

아니면 N을 int로 변경하십시오 그것은 비 선언적 형식을 사용하여 시작하는 것이 많은 의미가있는 것처럼 보입니다. –

+0

@SeanBurton도 잘 작동합니다. –