การเรียงลำดับอาเรย์ตามดัชนี: เบื้องหลังปริศนาด้วย C++

การเรียงลำดับอาเรย์เป็นงานพื้นฐานในโปรแกรมมิ่ง แต่จะเกิดอะไรขึ้นหากคุณต้องการเพียงดัชนีของค่าที่เรียงลำดับแทนค่าที่ถูกเรียงลำดับด้วยตนเอง? ปัญหาทั่วไปนี้ได้กระตุ้นความสนใจของนักพัฒนาหลายคน โดยเฉพาะผู้ที่ใช้ C หรือ C++ ในโพสต์นี้ เราจะคลี่คลายวิธีการเรียงลำดับอาเรย์ตามค่าในขณะที่ส่งคืนดัชนีขององค์ประกอบในลำดับที่เรียงลำดับ

ความท้าทาย

ลองจินตนาการว่าคุณมีอาเรย์ของจำนวนเต็ม และเป้าหมายของคุณคือการเรียงลำดับมันในลำดับที่เพิ่มขึ้น อย่างไรก็ตาม แทนที่จะคืนค่าที่เรียงลำดับ คุณต้องการอาเรย์ที่บ่งชี้ถึงดัชนีดั้งเดิมของจำนวนที่เรียงลำดับเหล่านี้ ตัวอย่างเช่น สำหรับอาเรย์ข้อมูลเข้าดังต่อไปนี้:

ข้อมูลเข้า:  1, 3, 4, 9, 6

ผลลัพธ์ควรสะท้อนถึงดัชนีของค่าที่เรียงลำดับ:

ผลลัพธ์: 1, 2, 3, 5, 4

เบี่ยงเบนจากการเรียงลำดับ

คุณอาจกำลังใช้วิเคราะห์การเรียงลำดับ เช่น ขั้นตอนการเรียงลำดับแบบ shell ตามที่ได้กล่าวถึงในคำถาม อย่างไรก็ตาม การนำไปใช้งานในบางโปรแกรมมิ่งอาจทำให้เกิดข้อผิดพลาด โดยเฉพาะเมื่อทำงานกับพอยเตอร์ โพสต์นี้มีเป้าหมายเพื่อชี้แจงวิธีการทำงานกับอาเรย์ใน C/C++ และสร้างฟังก์ชันการเรียงลำดับที่ตรงตามข้อกำหนดที่ระบุ

ขั้นตอนที่ 1: สร้างอาเรย์ของพอยเตอร์

เพื่ออำนวยความสะดวกในการเรียงลำดับโดยไม่สูญเสียข้อมูลตำแหน่ง เราสามารถสร้างอาเรย์ของพอยเตอร์ที่ชี้ไปยังองค์ประกอบของอาเรย์ต้นฉบับ วิธีนี้เมื่อเราเรียงพอยเตอร์ เราก็จะเรียงค่าของอาเรย์ต้นฉบับในทางอ้อมในขณะที่รักษาแมพดัชนีไว้ นี่คือวิธีทำ:

int* intArray; // จะถูกตั้งค่าเริ่มต้นด้วยค่าเต็มของคุณ
int arrayLen;  // ความยาวของอาเรย์จำนวนเต็ม

int** pintArray = new int*[arrayLen]; // สร้างอาเรย์ของพอยเตอร์
for(int i = 0; i < arrayLen; ++i)
{
    pintArray[i] = &intArray[i]; // ชี้ไปที่องค์ประกอบที่เกี่ยวข้อง
}

ขั้นตอนที่ 2: เรียงลำดับอาเรย์ของพอยเตอร์

เมื่อคุณมีพอยเตอร์พร้อมแล้ว คุณสามารถใช้และวิเคราะห์การเรียงลำดับใด ๆ (เช่น shell sort) เพื่อเรียงพอยเตอร์ตามค่าที่พวกเขาชี้ไป ที่นี่คือการสาธิตอย่างง่าย:

SortIntPointers(pintArray, arrayLen); // เรียงลำดับอาเรย์พอยเตอร์ตามค่า

ขั้นตอนที่ 3: กำหนดดัชนีที่เรียงลำดับ

หลังจากเรียงพอยเตอร์แล้ว คุณก็สามารถเดินผ่านพวกมันและกำหนดตำแหน่งที่เรียงลำดับที่สอดคล้องกลับไปยังอาเรย์พอยเตอร์ต้นฉบับ สิ่งนี้จะทำให้คุณมั่นใจได้ว่าคุณจะได้รับดัชนีที่เหมาะสม

for(int i = 0; i < arrayLen; ++i)
{
    *pintArray[i] = i; // กำหนดตำแหน่งดัชนีที่เรียงลำดับ
}

ตัวอย่างการใช้งานแบบเต็ม

ในการรวมทุกอย่างเข้าด้วยกัน นี่คือตัวอย่างที่สมบูรณ์ซึ่งเป็นไปตามขั้นตอนที่ระบุไว้ข้างต้น:

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]) // เปลี่ยนเป็นลำดับที่เพิ่มขึ้น
            { 
                temp = pArray[j]; // สลับองค์ประกอบ
                pArray[j] = pArray[j + 1];
                pArray[j + 1] = temp;
                flag = 1; // เกิดการสลับขึ้น
            }
        }
    }
}

// ตั้งค่าและเรียงพอยเตอร์ของคุณตามที่แสดงไว้ก่อนหน้านี้

สรุป

การเรียงลำดับอาเรย์ตามดัชนีโดยไม่สูญเสียการติดตามตำแหน่งดั้งเดิมของพวกมันอาจเป็นเรื่องยุ่งยาก โดยเฉพาะอย่างยิ่งเมื่อใช้พอยเตอร์ใน C/C++ โดยการสร้างอาเรย์ของพอยเตอร์และเรียงลำดับมัน คุณสามารถจัดการกับความท้าทายนี้ได้อย่างมีประสิทธิภาพ อย่าลืมที่จะนำการจัดการข้อผิดพลาดและพิจารณาสถานการณ์ขอบเพื่อโค้ดที่แข็งแกร่งเพิ่มเติม สนุกกับการเขียนโค้ด!