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}

เพื่อแก้ปัญหานี้ เราจะสร้างวิธีการเปรียบเทียบแบบกำหนดเอง วิธีนั้นจะเปรียบเทียบและวางองค์ประกอบในอาร์เรย์ ตรรกะการเปรียบเทียบจะเป็นดังนี้ -

  • ถ้า num1 และ num2 ทั้งคู่อยู่ใน A2 ตัวเลขที่มีดัชนีต่ำกว่าใน A2 จะถือว่าน้อยกว่าตัวเลขอื่น
  • หากมี num1 หรือ num2 ใน 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