c语言关于排序的问题,比较难对数组排序想必不是难事,但他的逆过程
组排序想必不是难事,但他的逆过程怎样实现呢 设想 int a[n]; for(int i= 0; i< n; i++ )a[i]=i; 怎样把它打乱? 写这样一个程序也不难,难的是写得好 ,我的最快的算法是 1。随机取一个a[i]给b[0]; 2.把a中取出元素之后的部分前移; 3。b下标++ 在前n个a中重复第一步 可是,打乱数组是一个熵增加的操作,比起排序应该简单的多才是,就象洗扑克牌比把扑克牌排序简单的多。而这个打乱算法要比排序复杂很多。 求教打乱数组的好的算法,肯定会有让人眼前一亮的
以前回答过一个的问题时想过这个问题,把当时VB的思路翻译成C程序如下: #include "stdio.h" #include "stdlib.h" #include "time.h" #define N 10 void main() { int a[N],b[N],j,i,temp; srand((unsigned)time(NULL)); for(i=0;i=0;i--) { j=rand(); j=j%(i+1); b[i]=a[j]; temp=a[i]; a[i]=a[j]; a[j]=temp; } for(i=0;i> 16) & 0x7fff); } 把系统时间带给srand作为第一个holdrand,在rand()里利用holdrand按一个算法计算新的holdrand并返回。holdrand这个变量就可以重复利用了。