我有两个数组
(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);
是否有任何逻辑可以获得以上输出,以便我可以摆脱写作 完整的排序算法?
答案 0 :(得分:1)
方法1:创建索引0到n-1的数组;使用lambda比较sort来比较arrEnd []元素。然后使用排序索引根据排序索引数组重新排序两个数组。
方法2:创建一个指向arrEnd []元素的指针数组,然后使用compare函数对指针数组进行排序。比较函数只需要知道元素的类型。然后根据排序指针数组重新排序两个数组。
方法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;
}