การเรียงลำดับอาเรย์ตามดัชนี: เบื้องหลังปริศนาด้วย 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++ โดยการสร้างอาเรย์ของพอยเตอร์และเรียงลำดับมัน คุณสามารถจัดการกับความท้าทายนี้ได้อย่างมีประสิทธิภาพ อย่าลืมที่จะนำการจัดการข้อผิดพลาดและพิจารณาสถานการณ์ขอบเพื่อโค้ดที่แข็งแกร่งเพิ่มเติม สนุกกับการเขียนโค้ด!