簡體   English   中英

計算堆排序和插入排序中的復制和比較次數

[英]Counting number of copying and comparisons in heapsort and insertation sort

我想計算算法進行比較的次數以及算法進行復制的次數。

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


void generuoti(int _N, const char *_file);
void nuskaityti(const char *_file);
int ps = 0;
int ks = 0;
void heapify(double arr[], int n, int i)
{
    int largest = i;  // Initialize largest as root
    int l = 2 * i + 1;  // left = 2*i + 1
    int r = 2 * i + 2;  // right = 2*i + 2


    // If left child is larger than root
    if (l < n && arr[l] > arr[largest])
        largest = l;
        ps+=1;

    // If right child is larger than largest so far
    if (r < n && arr[r] > arr[largest])
        largest = r;
        ps += 1;
    // If largest is not root
    if (largest != i)
    {
        std::swap(arr[i], arr[largest]);
        ps += 1;
        ks += 1;
        // Recursively heapify the affected sub-tree
        heapify(arr, n, largest);
    }
}

// pagr funkcija haep sortui
void heapSort(double arr[], int n)
{
    // Build heap (rearrange array)
    for (int i = n / 2 - 1; i >= 0; i--)
        heapify(arr, n, i);

    // One by one extract an element from heap
    for (int i = n - 1; i >= 0; i--)
    {
        // Move current root to end
        std::swap(arr[0], arr[i]);
        ks+=1;

        // call max heapify on the reduced heap
        heapify(arr, i, 0);
    }
}

void insertion_sort(double arr[], int n)
{
    int i, key, j;
    for (i = 1; i < n; i++)
    {
        key = arr[i];
        j = i - 1;
        ks+=1;

        while (j >= 0 && arr[j] > key)
        {
            arr[j + 1] = arr[j];
            j = j - 1;
            ks+=1;
            ps+=1;
        }
        arr[j + 1] = key;
            ks+=1;
    }
}

using namespace std;

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



int main()
{
    srand(time(NULL));
    cout << "Generuojame atsitktinius duomenis" << endl;
    generuoti(20000, "duom.txt");
    cout << "Nuskaitome duomenis" << endl;
    nuskaityti("duom.txt");
    A = new double[(int)N];
    B = new double[(int)N];//jeigu algoritmui reikia papildomo masyvo
    for (int i = 0; i < N; i++) {
        A[i] = Data[i];
    }

    cout << "Pradine skaiciu seka:" << endl;
    for (int i = 0; i < N; i++)
        cout << A[i] << " ";
    cout << endl;
    //


    insertion_sort(A, N);
    //heapSort(A, N);

    //truksta veiksmu sk
    cout << "Surusiuota skaiciu seka:" << endl;
    for (int i = 0; i < N; i++)
        cout << A[i] << " ";
    cout << endl;
    cout << "Kopijavimu skaicius " << ks << endl;
    cout << "Palyginimu skaicius " << ps << 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 << " " << 500+ (double)(rand() % 3001) ;
    os.close();
}

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

這是我的代碼,ps-等於比較數,ks-等於復制數。 我想問一下我是否計算了算法中的所有比較和所有復制? 感謝您的回答。

沒有

  if (l < n && arr[l] > arr[largest]) largest = l; ps+=1; 

這里有兩個問題。 假設您正在談論雙重比較(而不是整數),則比較可能會或可能不會發生。 其次,您的縮進是極具誤導性的。 (您總是增加。)您需要

    if (l < n) {
        ps++;  // About to compare
        if (arr[l] > arr[largest])
            largest = l;
    }

可能還有其他錯誤,但是由於我看不懂您的語言而無法分辨,因此打印的文字,注釋和名稱毫無意義。

假設您使用C ++編寫,我將使用operator <()operator =以及復制構造函數編寫一個類,並對它們進行檢測。 這樣,你不可能得到它錯了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM