C 对数组的索引进行排序
我有这样一个数组:C 对数组的索引进行排序,c,arrays,algorithm,sorting,C,Arrays,Algorithm,Sorting,我有这样一个数组:a[]={2,3,4,5,8,2,5,6} 现在我想对索引进行排序,但要保持原始数组的完整性,并得到如下内容a_index[]={0,5,1,2,3,6,7,4} 对此,我有一个O(N^2)算法。有人能给我一个更好的(最好是O(NlogN))吗?创建一个包含两个字段的结构:index和value 创建此结构的数组,其中每个元素(struct)都是数组中元素的原始索引和值 仅使用O(nlogn)中的值对结构进行排序 完成后-按排序顺序迭代数组以获得排序的索引。通过执行任何排序算法
a[]={2,3,4,5,8,2,5,6}
现在我想对索引进行排序,但要保持原始数组的完整性,并得到如下内容
a_index[]={0,5,1,2,3,6,7,4}
对此,我有一个
O(N^2)
算法。有人能给我一个更好的(最好是O(NlogN)
)吗?创建一个包含两个字段的结构:index
和value
创建此结构的数组,其中每个元素(struct)都是数组中元素的原始索引和值
仅使用O(nlogn)中的值对结构进行排序
完成后-按排序顺序迭代数组以获得排序的索引。通过执行任何排序算法,并进行以下调整,这不是基本上可以解决的问题: 通常情况下,您会比较以下内容:
if(a[x]
您现在将执行以下操作:
if(a[a_索引[x]]
而不是:
swap(a[x],a[x+1])
您将执行以下操作:
swap(a_索引[x],a_索引[x+1])
(其中,一个_索引初始化为包含最初按顺序排列的索引范围(0..sizeof(a))
因为从本质上讲,索引只是一个查找表,其中用于排序的值是a中的对应值。(实际上,与我们通常进行排序时所做的相比,这只是另一个间接层次,因为通常我们也不会直接比较(x)和(x+1)
也可以在不进行就地排序的情况下执行类似的解决方案,只要您将所有值与A中的相应值进行比较,而不是比较使用qsort
例如
#包括
#包括
国际*阵列;
int cmp(常数无效*a,常数无效*b){
int ia=*(int*)a;
int-ib=*(int*)b;
返回(TheArray[ia]>TheArray[ib])-(TheArray[ia]
谢谢..我会试试..想不出struct!!qsort更复杂的是O(n^2)。我知道。那么qsort()使用什么算法呢?Quicksort得到了广泛的采用,例如,它在Unix中作为默认的库排序函数出现,因此它的名字来源于C标准库函数qsort和Java的参考实现。(参见历史)当前名称为只留下标记,并且假设算法为快速排序是不正确的。参考:阅读注释。
#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;
}