博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[读书笔记]一种有趣的排序算法
阅读量:5322 次
发布时间:2019-06-14

本文共 1811 字,大约阅读时间需要 6 分钟。

最近在
《编程珠玑》 这本书上看到一种有趣的高效排序方法, 在这里介绍下。

排序的前提条件:

  • 排序的数据中没有重复的数据
  • 数据的分布应该相对集中些

这时可以利用位操作来进行排序.比如说如果你要对0~999中的100个数排序, 先创建一个125字节(1000位)长的数组c.如果你从待排序的数据中读到x, 则将c的第x位置一. 之后通过按位读c的值, 就可以输出排序好的数据了. 简单而高效, 不过就是条件有些苛刻.

 

附上一段C写的实现, 代码可以产生一个含100万个大于0小于1000万的无重复随机数的文件data.txt, 并输出一个排好序的文件sort.txt

1 #include  
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 9 #define N 10000000 10 #define N_M 1000000 11 12 13 unsigned char a[8] = { 1, 2, 4, 8, 16, 32, 64, 128}; 14 15 int main(int argc, char *argv[]) 16 { 17 void randdata(unsigned char *const c); 18 int sort(); 19 unsigned char * const c = (unsigned char* const)malloc(N/8); 20 randdata(c); 21 sort(); 22 free(c); 23 return 0; 24 } 25 26 //产生100万个0~1000万间无重复的随机数 27 void randdata(unsigned char *const c) 28 { 29 int i, j, k, idx; 30 FILE *fp; 31 fp = fopen("data.txt", "w"); 32 assert(fp != NULL); 33 srand(time(NULL)); 34 for( idx = 0 ; idx < N_M ; ) 35 { 36 //随机数有位数限制 37 i = ((rand() << 16) + rand()) % N; 38 j = i / 8; 39 k = i % 8; 40 if((c[j] & a[k]) == 0) 41 { 42 idx++; 43 c[j] |= a[k]; 44 fprintf(fp, "%d\n", i); 45 } 46 } 47 fclose(fp); 48 } 49 50 //高效排序 51 int sort() 52 { 53 unsigned char c[N/8] = { 0}; 54 int i, j, k; 55 FILE *fp; 56 fp = fopen("data.txt", "r"); 57 assert(fp != NULL); 58 while(fscanf(fp, "%d", &i) > 0) 59 { 60 j = i / 8; 61 k = i % 8; 62 c[j] |= a[k]; 63 }; 64 fclose(fp); 65 fp = fopen("sort.txt", "w"); 66 for( i = 0, j = 0; i < N/8; i++ ) 67 { 68 if(c[i] == 0)continue; 69 else 70 { 71 for( j = 0 ; j < 8 ; j++ ) 72 { 73 if(c[i] & a[j])fprintf(fp, "%d\n", (i<<3)+j); 74 } 75 } 76 } 77 fclose(fp); 78 return 0; 79 }

 

转载于:https://www.cnblogs.com/at2021/archive/2012/03/23/2413472.html

你可能感兴趣的文章
Invalid prop: type check failed for prop "maxlength". Expected Number, got String.
查看>>
ipfs私链服务
查看>>
C语言 · Sine之舞
查看>>
C语言 · 简单加法
查看>>
好用的在线Markdown编辑器
查看>>
camera 摄像机
查看>>
wtforms
查看>>
加载静态文件,父模板的继承和扩展
查看>>
struts2 日期类型问题
查看>>
javascript数据缓存策略之本地存储
查看>>
HTML5 API详解(1):fullscreen全屏模式
查看>>
AngularJs自定义指令详解(5) - link
查看>>
从“埋点技术已死?”开始说起
查看>>
[配置Cordova环境] [Alfred使用手册]
查看>>
EFCode First 导航属性
查看>>
嵌入式Linux开发
查看>>
Swift语法初见
查看>>
XML学习笔记(二)-- DTD格式规范
查看>>
前端基础之html
查看>>
I - Agri-Net - poj 1258
查看>>