在《算法导论》的第五章讲的是概率分析和随机算法,于是产生了现在的随机排列数组问题。随机化有助于平衡输入分布,进而有利于分析一个算法的平均情况行为。
特意去看了一下C语言里面产生随机数的函数(虽然是伪随机数)。
两个基本函数为:
int rand(void);
void srand(unsigned int n);
具体的可以参考如下:
http://blog.sina.com.cn/s/blog_574f9aa00100rkis.html
然后就是我的随机排列数组了。随机排列数组有两种方法:
第一种是为数组的每个元素赋予一个随机的优先级,然后根据优先级对数组元素进行排序;
void permuteBySorting(int *a,int n);
第二种是原址排列给定数组,在进行第i次迭代时,元素a[i]是从a[i]到a[n]随机选取的。第i次迭代以后,a[i]不再改变。
void randomizedInPlace(int *a,int n);
下面贴代码啦:
void permuteBySorting(int *a,int n){
int *p,*q,*b;
p=(int *)malloc(sizeof(int)*n);
q=(int *)malloc(sizeof(int)*n);
b=(int *)malloc(sizeof(int)*n);
int i,j,t,m=n*n*n;
srand((unsigned)time(NULL));
for(i=0;i<n;i++){
p[i]=rand()%m+1;
printf("%d ",p[i]);
}
j=n-1;
while(j>=0){
int max=0;
for(i=1;i<n;i++){
if(p[max]<p[i]){
max=i;
}
}
q[j]=max;
p[max]=INT_MIN;
j--;
}
printf("\n");
for(i=0;i<n;i++){
b[i]=a[q[i]];
printf("%d ",b[i]);
}
}
void randomizedInPlace(int *a,int n){
srand((unsigned)time(NULL));
int i,j;
for(i=0;i<n;i++){
j=rand()%(n-i)+i;
int t=a[i];
a[i]=a[j];
a[j]=t;
printf("%d-%d ",a[i],j);
}
}
我最近malloc动态分配数组用的很6嘛。
还是没有勇气尝试分治法求矩阵乘法。。。