Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 对数组的索引进行排序_C_Arrays_Algorithm_Sorting - Fatal编程技术网

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;
}