Seleksi Sortir Program Dalam C

Saya harus menggunakan Seleksi Seleksi untuk mengurutkan array dengan panjang 100K, 150K, 200K, dan 1M dan menyediakan waktu yang diperlukan untuk mengurutkan setiap array serta jumlah perbandingan elemen ke elemen.

Saya mencapai ini dengan membuat array dengan item sebagai panjang array. Kemudian saya menggunakan array tersebut dalam for loop, meneruskan elemen yang digunakan sebagai ukuran array yang tidak disortir untuk dibangun, dan membangun array yang dibuat secara acak.

Saya kemudian mengurutkan menggunakan panggilan fungsi.

Kode:

// C program for implementation of selection sort
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

long long int counterS = 0; //counter for number of element to element comparisons

void swap(int *xp, int *yp) //swap function
{
    int temp = *xp;
    *xp = *yp;
    *yp = temp;
}

void selectionSort(int arr[], long long int n)
{
    long long int i, j, min_idx;    //used long long int cuz they reach upto 10^6 order

    // One by one move boundary of unsorted subarray
    for (i = 0; i < n-1; i++)
    {
        // Find the minimum element in unsorted array
        min_idx = i;
        for (j = i+1; j < n; j++) {
            if (arr[j] < arr[min_idx])
                min_idx = j;
            ++counterS;             //increments each time a comparison occurs
        }
        // Swap the found minimum element with the first element
        swap(&arr[min_idx], &arr[i]);
    }
}

// Driver program to test above functions
int main()
{
    clock_t tic1, toc1;
    int sz[4]={100000,150000, 200000, 1000000}; //array having array lengths
    int k;

    for(k=0;k<4;k++){
    printf("1st check: It's the long long int declaration\n");  //1st check to get to know where it went wrong
    long long int size = sz[k];
    printf("2nd check: It's the array declaration\n");          //2nd check to know where it went wrong
    int arr[size];
    printf("3rd check: It's not the array declaration\n");      //3rd check to know where it went wrong

    long long int i;
    for(i=0;i<size;i++)
        arr[i]=rand()%100;

    long long int n = sizeof(arr)/sizeof(arr[0]);
    printf("4th check: It's the random array generation\n");    //4th check to know where it went wrong

    tic1 = clock();
    selectionSort(arr, n);
    toc1 = clock();
    double time_taken = (double)(toc1-tic1)/CLOCKS_PER_SEC;
    printf("5th check: It's the function call\n");              //5th check to know where it went wrong

    printf("Selection Sort - time = %lf seconds, element by element comparisons = %lld\n",
    time_taken, counterS );
    }
    return 0;
}

Keluaran:

1st check: It's the long long int declaration
2nd check: It's the array declaration
3rd check: It's not the array declaration
4th check: It's the random array generation
5th check: It's the function call
Selection Sort - time = 11.458000 seconds, element by element comparisons = 4999950000
1st check: It's the long long int declaration
2nd check: It's the array declaration
3rd check: It's not the array declaration
4th check: It's the random array generation
5th check: It's the function call
Selection Sort - time = 59.196000 seconds, element by element comparisons = 16249875000
1st check: It's the long long int declaration
2nd check: It's the array declaration
3rd check: It's not the array declaration
4th check: It's the random array generation
5th check: It's the function call
Selection Sort - time = 120.349000 seconds, element by element comparisons = 36249775000
1st check: It's the long long int declaration
2nd check: It's the array declaration

Perangkat lunak bekerja dengan baik untuk tiga panjang larik pertama saya (100K, 150K, dan 200K), namun tidak berfungsi sama sekali untuk penyortiran panjang larik 1M.

Saya tidak dapat menemukan di mana dalam program itu menghentikan eksekusi. Gagasan awal saya adalah bahwa masalahnya ada pada deklarasi bilangan bulat saya, yang jumlahnya mencapai satu juta. Menurut dokumentasi, saya menggunakan pernyataan printf secara berkala untuk menentukan di mana aliran program terganggu, dan itu mengejutkan deklarasi array (seperti inilah yang menurut saya, meskipun tidak yakin).

Saya telah melampirkan kode dan keluaran yang saya terima.

avatar smithy
@smithy

13 Kontribusi 1 Poin

Diperbarui 1 tahun yang lalu

2 Jawaban:

<div>kemungkinan masalah terjadi pada deklarasi array di dalam loop for. Deklarasi array pada C harus dilakukan pada waktu kompilasi dan ukuran array harus diketahui sebelumnya. disini mencoba membuat array dengan ukuran yang ditentukan oleh variabel "size", yang tidak mungkin dilakukan pada waktu kompilasi karena nilai variabel tersebut belum diketahui saat itu.<br><br>Untuk mengatasi masalah ini, bisa menggunakan alokasi memori dinamis menggunakan fungsi malloc() untuk membuat array dengan ukuran yang ditentukan pada waktu runtime.<br><br></div><pre>int* arr = (int*) malloc(size * sizeof(int));

// Gunakan array seperti biasa

free(arr); // Setelah selesai digunakan, jangan lupa untuk membebaskan memori</pre><div><br>Pastikan untuk membebaskan memori setelah selesai digunakan, karena tidak melakukannya dapat menyebabkan kebocoran memori pada program.</div>

avatar yukari06
@yukari06

137 Kontribusi 66 Poin

Dipost 1 tahun yang lalu

<div>Masalah yang Anda alami kemungkinan disebabkan oleh keterbatasan memori pada sistem Anda. Ukuran larik 1 juta elemen memerlukan lebih banyak memori dibandingkan dengan larik dengan ukuran lebih kecil, yang dapat menyebabkan program Anda gagal berjalan atau tidak berjalan dengan baik.<br><br></div><div><br>Untuk mengatasi masalah ini, Anda dapat mempertimbangkan beberapa opsi, seperti:<br><br></div><ol><li>Menggunakan algoritma pengurutan yang lebih efisien seperti merge sort atau quick sort, yang dapat mengurangi jumlah perbandingan elemen ke elemen yang diperlukan dan mengurangi waktu yang dibutuhkan untuk pengurutan.</li><li>Meningkatkan memori yang tersedia pada sistem Anda, misalnya dengan menambahkan lebih banyak RAM atau menggunakan perangkat lunak yang dapat memperluas ruang kerja Anda.</li><li>Menerapkan teknik pengurangan ukuran masalah, seperti pengurangan ukuran larik atau membagi larik menjadi beberapa bagian dan mengurutkannya secara terpisah.</li></ol><div><br>Anda dapat mencoba salah satu atau lebih dari opsi ini untuk mengatasi masalah Anda.</div>

avatar adamajalah27
@adamajalah27

120 Kontribusi 40 Poin

Dipost 1 tahun yang lalu

Login untuk ikut Jawaban