This question already has answers here:
Sorting two corresponding arrays
(4个答案)
4年前关闭。
我有两个数组
我想对
输出:
我在用
有没有什么逻辑可以超过输出,这样我就可以摆脱写作
完整的排序算法?
(4个答案)
4年前关闭。
我有两个数组
(i) arrStart[]={0 1 3 5 6 8 10 12 15};
(ii) arrEnd[]={4 2 7 11 16 9 14 13 17};
我想对
arrEnd[]
进行排序,以使arrStart[]
中的相应整数也可以与arrEnd[]
的整数交换匹配,例如输出:
(i) arrStart[]={1 0 3 8 5 12 10 6 15};
(ii) arrEnd[]={2 4 7 9 11 13 14 16 17};
我在用
sort(arrEnd,arrEnd+8);
有没有什么逻辑可以超过输出,这样我就可以摆脱写作
完整的排序算法?
最佳答案
方法1:创建一个索引数组0到n-1;使用带有lambda比较的sort来比较arrEnd []元素。然后,使用排序后的索引根据排序后的索引数组对两个数组重新排序。
方法2:创建指向arrEnd []元素的指针数组,然后使用比较函数对指针数组进行排序。比较功能只需要知道元素的类型。然后根据排序的指针数组对两个数组重新排序。
方法2的示例。就地重新排序时间复杂度是线性的O(n)。
bool compare(const int *p0, const int *p1)
{
return *p0 < *p1;
}
int main()
{
int a[8] = {7,5,0,6,4,2,3,1};
char b[8] = {'h','f','a','g','e','c','d','b'};
int *pa[8];
size_t i, j, k;
int ta;
char tb;
// create array of pointers to a[]
for(i = 0; i < sizeof(a)/sizeof(a[0]); i++)
pa[i] = &a[i];
// sort array of pointers to a[]
std::sort(pa, pa+sizeof(a)/sizeof(a[0]), compare);
// reorder a[] and b[] according to the array of pointers to a[]
for(i = 0; i < sizeof(a)/sizeof(a[0]); i++){
if(i != pa[i]-a){
ta = a[i];
tb = b[i];
k = i;
while(i != (j = pa[k]-a)){
a[k] = a[j];
b[k] = b[j];
pa[k] = &a[k];
k = j;
}
a[k] = ta;
b[k] = tb;
pa[k] = &a[k];
}
}
for(i = 0; i < sizeof(a)/sizeof(a[0]); i++)
std::cout << a[i] << ' ';
std::cout << std::endl;
for(i = 0; i < sizeof(b)/sizeof(b[0]); i++)
std::cout << b[i] << ' ';
std::cout << std::endl;
return 0;
}
10-04 21:59