在 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
廣告
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP