如何提高C中大数据排序的执行速度

时间:2015-05-28 16:24:17

标签: c performance sorting insertion-sort

我设法滚动了一个插入排序例程,如下所示:

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

typedef struct{
    int n;
    char l;
    char z;
} dat;

void sortx(dat* y){
    char tmp[sizeof(dat)+1];
    dat *sp=y;
    while(y->l){
        dat *ip=y;
        while(ip>sp && ip->n < (ip-1)->n){
            memcpy(tmp,ip,sizeof(dat));
            memcpy(ip,ip-1,sizeof(dat));
            memcpy(ip-1,tmp,sizeof(dat));
            ip--;
        }
        y++;
    }
}

void printa(dat* y){
    while(y->l){printf("%c %d,",y->l,y->n);y++;}
    printf("\n");
}

int main(int argc,char* argv[]){
    const long sz=10000;
    dat* new=calloc(sz+2,sizeof(dat));
    dat* randx=new;
    //fill struct array with random values
    int i;
    for (i = 0 ; i < sz ; i++) {
        randx->l = (unsigned char)(65+(rand() % 25));
        randx->n = (rand() % 1000);randx++;
    }
    //sort - takes forever
    sortx(new);
    printa(new);
    free(new);
    return 0;
}

我的排序程序部分来自:http://www.programmingsimplified.com/c/source-code/c-program-insertion-sort 但是因为我正在根据结构中的数值对数组进行排序,所以到目前为止memcpy对我有用。

我用来执行此代码的计算机有一个Pentium 1.6Ghz处理器,当我将main函数中的sz更改为至少20000时,我注意到我必须等待两秒才能在屏幕上看到结果。

我测试大数字的原因是因为我想在C中处理服务器日志,并且会按时间戳排序信息,有时日志会变得非常大,我不想放由于运行其他进程(例如apache),CPU上的压力太大。

无论如何我可以改进这段代码,所以我不必等待两秒才能看到20000个结构排序?

3 个答案:

答案 0 :(得分:2)

已经有一个功能可以执行此操作,它已内置在C标准库中:qsort。你只需要提供合适的比较功能。

如果作为左参数的项目应按先前的顺序排列,-1如果应该稍后放置,1如果要0确认相等的项目。

qsort

如果你想加快速度,你可以让int dat_sorter(const void* l, const void* r) { const dat* left = (const dat*)l; const dat* right = (const dat*)r; if(left->n > right->n) return 1; else if(left->n < right->n) return -1; else return 0; } void sortx(dat* y) { /* find the length */ dat* it = y; size_t count = 0; while(it->l) { count++; it++; } /* do the sorting */ qsort(y, count, sizeof(dat), dat_sorter); } 函数占用数组的长度,因此函数不需要自己弄清楚。

答案 1 :(得分:0)

使用快速排序,堆排序或自下而上合并排序。 Wiki在他们的文章中有这些例子,并且通常在每篇文章的谈话页面上都有更完整的例子。

答案 2 :(得分:0)

插入排序具有O(n ^ 2)时间复杂度,并且还有其他算法可以为您提供O(nlogn)时间复杂度,如mergesort,quicksort和heapsort。看起来你要按整数排序,所以你也可以考虑使用LSD基数排序,这是O(n)时间复杂度。