Mengurutkan Array berdasarkan Indeks: Mengungkap Misteri dengan C++

Mengurutkan array adalah tugas fundamental dalam pemrograman, tetapi bagaimana jika Anda hanya memerlukan indeks dari nilai yang terurut daripada nilai itu sendiri? Masalah umum ini telah menarik perhatian banyak pengembang, terutama mereka yang menggunakan C atau C++. Dalam pos ini, kita akan mengurai bagaimana cara mengurutkan array berdasarkan nilai sambil mengembalikan indeks elemen dalam urutan yang telah diurutkan.

Tantangan

Bayangkan Anda memiliki array bilangan bulat, dan tujuan Anda adalah mengurutkannya dalam urutan menaik. Namun, alih-alih mengembalikan angka yang terurut itu sendiri, Anda menginginkan sebuah array yang menunjukkan indeks asli dari angka-angka yang terurut ini. Sebagai contoh, diberikan array input:

Input:  1, 3, 4, 9, 6

Outputnya harus mencerminkan indeks dari nilai-nilai yang telah diurutkan:

Output: 1, 2, 3, 5, 4

Sebuah Twist pada Pengurutan

Anda mungkin menggunakan algoritma pengurutan seperti prosedur shell sort yang disebutkan dalam permintaan. Namun, beberapa implementasi pemrograman dapat menyebabkan kesalahan, terutama saat berurusan dengan pointer. Pos ini bertujuan untuk menjelaskan bagaimana cara bekerja dengan array dalam C/C++ dan membuat fungsi pengurutan yang memenuhi persyaratan yang ditentukan.

Langkah 1: Buat Array Pointer

Untuk memfasilitasi pengurutan tanpa kehilangan informasi posisi, kita dapat membuat array pointer yang menunjuk ke elemen dari array asli. Dengan cara ini, ketika kita mengurutkan pointer, kita secara tidak langsung mengurutkan nilai array asli sambil mempertahankan peta indeks. Berikut adalah cara melakukannya:

int* intArray; // Ini akan diinisialisasi dengan nilai-nilai bilangan bulat Anda.
int arrayLen;  // Panjang dari array bilangan bulat.

int** pintArray = new int*[arrayLen]; // Buat array pointer.
for(int i = 0; i < arrayLen; ++i)
{
    pintArray[i] = &intArray[i]; // Mengarah ke elemen yang sesuai.
}

Langkah 2: Urutkan Array Pointer

Setelah Anda memiliki pointer yang siap, Anda dapat menerapkan algoritma pengurutan apa pun (seperti shell sort) untuk mengurutkan pointer berdasarkan nilai yang mereka tunjuk. Berikut adalah demonstrasi sederhana:

SortIntPointers(pintArray, arrayLen); // Mengurutkan array pointer berdasarkan nilai.

Langkah 3: Tetapkan Indeks yang Terurut

Setelah mengurutkan pointer, Anda kemudian dapat menelusurinya dan menetapkan posisi yang terurut kembali ke array pointer asli. Ini memastikan Anda mendapatkan indeks yang sesuai.

for(int i = 0; i < arrayLen; ++i)
{
    *pintArray[i] = i; // Menetapkan posisi indeks yang terurut.
}

Contoh Implementasi Penuh

Menggabungkan semuanya, berikut adalah contoh lengkap mengikuti langkah-langkah yang diuraikan di atas:

void SortIntPointers(int** pArray, int ArrayLength) {
    int flag = 1;    
    int* temp;    
    
    for (int i = 1; (i <= ArrayLength) && flag; i++)
    {
        flag = 0;
        for (int j = 0; j < ArrayLength - 1; j++)
        {
            if (*pArray[j + 1] < *pArray[j]) // Mengubah menjadi urutan menaik
            { 
                temp = pArray[j]; // Tukar elemen
                pArray[j] = pArray[j + 1];
                pArray[j + 1] = temp;
                flag = 1; // Terjadi pertukaran.
            }
        }
    }
}

// Inisialisasi dan urutkan pointer Anda seperti yang ditunjukkan sebelumnya.

Kesimpulan

Mengurutkan array berdasarkan indeks tanpa kehilangan jejak posisi aslinya bisa menjadi rumit, terutama dengan pointer di C/C++. Dengan membuat array pointer dan mengurutkannya, Anda dapat mengelola tantangan ini secara efektif. Ingat untuk menerapkan penanganan kesalahan dan mempertimbangkan kasus ujung untuk kode yang lebih kuat. Selamat coding!