Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

เรียงอาร์เรย์ตามลำดับที่กำหนดโดยอาร์เรย์อีกอันใน C++


ในส่วนนี้เราจะดูปัญหาการเรียงอีกข้อ สมมติมีอาร์เรย์สองอัน A1 และ A2 เราต้องเรียง A1 ให้ลำดับสัมพัทธ์ของสมาชิกเหมือนกับใน A2 หากบางสมาชิกไม่อยู่ใน A2 จะต่อท้ายหลังสมาชิกที่เรียงแล้ว สมมติ A1 และ A2 คือ −

A1 = {2, 1, 2, 1, 7, 5, 9, 3, 8, 6, 8} A2 = {2, 1, 8, 3}

หลังเรียง A1 จะเป็น −

A1 = {2, 2, 1, 1, 8, 8, 3, 5, 6, 7, 9}

วิธีแก้คือสร้าง custom compare method วิธีเปรียบเทียบคือ −

  • ถ้า num1 และ num2 ทั้งคู่อยู่ใน A2 ตัวที่มี index ต่ำกว่าใน A2 จะถือว่าน้อยกว่า
  • ถ้ามีเพียงตัวเดียวอยู่ใน A2 ตัวนั้นจะถือว่าน้อยกว่าอีกตัวที่ไม่อยู่
  • ถ้าทั้งคู่ไม่อยู่ใน A2 ใช้ลำดับตามค่าตัวเลข

อัลกอริทึม

compare(num1, num2): Begin   if both num1 and num2 are present in A2, then     return index of num1 – index of num2   else if num1 is not in A2, then     return -1   else if num2 is not in A1, then     return 1   else     num1 – num2 End

ตัวอย่าง

#include<iostream> #include<algorithm> using namespace std; int size = 5; int A2[5]; //global A2 will be used in compare function int search_index(int key){   int index = 0;   for(int i = 0; i < size; i++){     if(A2[i] == key)     return i;   }   return -1; } int compare(const void *num1, const void *num2){   int index1 = search_index(*(int*)num1);   int index2 = search_index(*(int*)num2);   if (index1 != -1 && index2 != -1)   return index1 - index2;   else if (index1 != -1)     return -1;   else if (index2 != -1)     return 1;   else     return (*(int*)num1 - *(int*)num2); } main(){   int data[] = {2, 1, 2, 1, 7, 5, 9, 3, 8, 6, 8};   int n = sizeof(data)/sizeof(data[0]);   int a2[] = {2, 1, 8, 3};   int n2 = sizeof(a2)/sizeof(a2[0]);   for(int i = 0; i<n2; i++){     A2[i] = a2[i];   }   qsort(data, n, sizeof(int), compare);   for(int i = 0; i<n; i++){     cout << data[i] << " ";   } }

ผลลัพธ์

2 2 1 1 8 8 3 5 6 7 9