如何在C ++中一起使用sort()函数?

时间:2015-11-11 05:49:15

标签: c++ sorting

我有两个数组

(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 :(得分: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;
}