- 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这个变量就可以重复利用了。