C 获取数组中所有可能元素组合的最小差异

C 获取数组中所有可能元素组合的最小差异,c,arrays,sorting,optimization,difference,C,Arrays,Sorting,Optimization,Difference,我有一个非常非常长的数组,我必须得到2个元素的所有可能组合的最小差 这是我的代码: [...] int diff = 1000000; // a very big difference that i'm sure is too big int tmpDiff; // swap //Compare for (size_t i = 0; i < N; i++) { // I try every combination of 2 elements of array for (siz

我有一个非常非常长的数组,我必须得到2个元素的所有可能组合的最小差

这是我的代码:

[...]
int diff = 1000000; // a very big difference that i'm sure is too big
int tmpDiff; // swap
//Compare
for (size_t i = 0; i < N; i++) {    // I try every combination of 2 elements of array
    for (size_t j = i + 1; j < N; j++) {  // don't repeat same elements
        tmpDiff = abs(array[i] - array[j]); // get the difference
        if (diff > tmpDiff) { // if it is smaller is the difference i need
            diff = tmpDiff;
        }

    }
}
[...]
[…]
int diff=1000000;//一个非常大的差异,我敢肯定是太大了
int tmpDiff;//交换
//比较
对于(size_t i=0;itmpDiff){//如果它较小,则是我需要的差异
diff=tmpDiff;
}
}
}
[...]

这需要太多的时间。如何优化性能?

首先对阵列进行排序。然后只需要比较连续的值。您甚至不需要使用
abs()
,因为您知道这两个元素中哪一个更大

如果不能更改阵列,请先复制它(下面未显示)

#包括
#包括
//整数的比较函数,与qsort兼容
整型整型cmp(常数无效*a,常数无效*b)
{ 
常量int*ia=(常量int*)a;//强制转换指针类型
常数int*ib=(常数int*)b;
返回*ia-*ib;
} 
...
int diff=int_MAX;
int d;
//分类
qsort(数组,N,sizeof(数组[0]),int_-cmp);
//比较连续的元素
对于(大小i=1;i
更新

qsort
使用快速排序算法对数组进行排序。如果有两个嵌套的for循环,排序的代价是O(n ln n)的顺序,而不是O(n^2)。对于较大的阵列(n>100),这会产生巨大的差异。算算一下:大约500对10000

传递给
qsort
的比较函数总是很棘手的,因为
qsort
的编写方式使得它可以处理任何类型的数组。函数被传递数组中两个元素的地址(指针)。对于像integer这样的小类型,如果它直接传递整数就很方便了。但是,你必须处理地址。所以你要做的是两件事:

  • 将指针转换为更具体的类型,即从任何类型的指针(
    void*
    )转换为指向整数(
    int*
    )的指针

  • 取消对指针的引用,即使用
    *
    运算符获取有效值,在本例中为
    *ia
    *ib


  • 如果第一个整数小于第二个整数,则函数需要返回小于0的数字;如果它们相等,则返回0;如果第二个整数较大,则返回大于0的数字。因此,一个古老的技巧派上了用场:只需返回第一个和第二个数字之间的差值。

    使用有效的排序,然后按顺序浏览列表,比较相邻元素。很好,它可以工作;)你能给我一个关于qsort和比较函数必须如何编写的简单解释吗?因为在大学里我们还没有学习指针和函数指针(但没关系,我想知道:P)。我发现从O(N^2)到平均O(N logn)应该是一个巨大的改进。除非你遇到了快速排序的最坏情况。我已经添加了比较函数的描述。
    #include <limits.h>
    #include <stdlib.h>
    
    // compare function for integer, compatible with qsort
    int int_cmp(const void *a, const void *b) 
    { 
        const int *ia = (const int *)a; // casting pointer types 
        const int *ib = (const int *)b;
        return *ia  - *ib; 
    } 
    
    ...
    
    int diff = INT_MAX;
    int d;
    
    // sort
    qsort(array, N, sizeof(array[0]), int_cmp);
    
    // compare consecutive elements
    for (size_t i = 1; i < N; i++) {
        d = array[i] - array[i - 1];
        if (d < diff)
            diff = d;
    }