我设法滚动了一个插入排序例程,如下所示:
#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个结构排序?
答案 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)时间复杂度。