对数组的索引进行排序

时间:2015-07-05 10:58:29

标签: c arrays algorithm sorting

我有一个如下所示的数组:Method m = MainMethodTest.class.getDeclaredMethod("main", String[].class); 现在我想对索引进行排序,但保持原始数组完整,并获得类似"C:/Program Files/Java/jdk1.8.0_31/bin/wsimport.exe" -keep https://domain.com/path_to_wsdl ...

的内容

我有一个a[]={2,3,4,5,8,2,5,6}算法。有人可以给我一个更好的(最好是a_index[]={0,5,1,2,3,6,7,4})吗?

3 个答案:

答案 0 :(得分:4)

创建一个包含两个字段的结构:indexvalue

创建此结构的数组,其中每个元素(struct)是数组中元素的原始索引和值。

仅使用O(nlogn)中的值对结构进行排序。

完成后 - 按排序顺序迭代数组以获取已排序的索引。

答案 1 :(得分:2)

使用qsort E.g

#include <stdio.h>
#include <stdlib.h>

int *TheArray;

int cmp(const void *a, const void *b){
    int ia = *(int *)a;
    int ib = *(int *)b;
    return (TheArray[ia] > TheArray[ib]) - (TheArray[ia] < TheArray[ib]);
}

int main(void) {
    int a[] = {2,3,4,5,8,2,5,6};
    size_t len = sizeof(a)/sizeof(*a);
    int a_index[len];
    int i;

    for(i = 0; i < len; ++i)
        a_index[i] = i;

    TheArray = a;
    qsort(a_index, len, sizeof(*a_index), cmp);

    for(i = 0; i < len; ++i)
        printf("%d ", a_index[i]);//5 0 1 2 6 3 7 4 : qsort is not a stable.
    printf("\n");

    return 0;
}

答案 2 :(得分:1)

这实际上可以通过任何排序算法的实现来解决,并进行以下调整:

通常情况下,您可以比较以下内容: if (a[x] < a[x+1])

你现在要做的事: if (a[a_index[x]] < a[a_index[x+1]])

而不是: swap(a[x], a[x+1])

你将会这样做: swap(a_index[x], a_index[x+1])

(其中a_index初始化为最初按顺序包含索引范围(0..sizeof(a))

由于a_index本质上只是一个查找表,其中用于排序的值是a中的对应值。 (实际上,与我们排序时通常所做的相比,这只是另一个间接层次,因为通常我们不会直接比较(x)和(x + 1))

类似的解决方案也可以在不进行就地排序的情况下完成,只要您对a中的相应值执行所有比较,而不是比较