分类：电脑/网络-程序设计-C/C++
问题：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<N;i++)a[i]=i;for(i=N-1;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<N;i++)printf("%3d",b[i]);getch();} ＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝从网上查了一些信息，粗略的看了一下，软件熵、信息熵、熵编码。。熵由热力学延伸到了更广泛的领域。跟编程有关的，似乎多提到程序维护、冗余、信息量、复杂度。但还是不知道怎么算程序对CPU电力的影响。。熵指的是某个系统中"无序"的总量，不知道我理解的对不对，对于程序来说，这个“无序”更多的是说编码的内容不够整洁、结构不够合理，而不是指结果的形式。如果刚才的理解角度不对的话，我想，按熵的理论来看，会对CPU造成负担的也许只有rand函数了。。它是使无序增长的基础，按概率来说也是范围越大某个数被rand到的概率越小，这个取值范围也和熵成正比。即使不考虑数的个数问题，似乎这个程序的目的就是在想办法使熵增加（使无序增加）。如果一定要讨论编码的内容对熵的影响的话，还是要把实现目标不能避免的熵变大考虑在内吧，更关注的是除此之外的部分。对了，还有个问题，关于你说的“有这样的熵变大的变化应该是自发进行，而并不是应该再增加体系外部的熵(CPU消耗的电力)”。运行任何程序的本身自然要消耗CPU，怎么能判断哪部分是“不应该”的呢？嗯，好像我这个人太麻烦了。。本来是你问了个问题的，我却乱七八糟问了这么多。。我对这个概念了解的还很少，如果想得很不着边的话请多包涵，见笑啦:p平常总想怎样是更专业更科学的编程方式，看了那些资料感觉，熵的理论不仅是在讨论热量和功，好像对编程也很有指导作用。。＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝我觉得程序里不存在绝对的随机，包括随机数的函数，写srand((unsigned)time(NULL));这句，也是指定它以时间为种子的。其实看看srand、rand两个函数的代码，里面的原理并不复杂：void __cdecl srand (unsigned int seed){        holdrand = (long)seed;}int __cdecl rand (void){        return(((holdrand = holdrand * 214013L + 2531011L) >> 16) & 0x7fff);}把系统时间带给srand作为第一个holdrand，在rand()里利用holdrand按一个算法计算新的holdrand并返回。holdrand这个变量就可以重复利用了。