我有一个如下所示的数组: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}
)吗?
答案 0 :(得分:4)
创建一个包含两个字段的结构:index
和value
。
创建此结构的数组,其中每个元素(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中的相应值执行所有比较,而不是比较