《算法-algorithm》第一章实验二 乱序检查

来源:互联网 发布:韩智慧知乎 编辑:程序博客网 时间:2024/06/10 13:00


Q:编写程序,接受参数m,n;将大小问m 的数组,打乱n次,而且每次打乱之前都将数组初始化为a[i]=i,打印一个m*m的表格,对于输出的【i,j】处的数字表示,i打乱后落到位置j的次数,预计正确的输出结果大约为m/n;

A:

//v乱序检查;void ShuffleTest(int m, int n){vector<int> a(m);//int *a = new int[m];int *mn=new int[n*m];int *sum = new int[m*m];for (int i = 0; i < m;i++){a[i] = i;}for (int i2 = 0; i2 < n*m;i2++){mn[i2] = 0;}for (int i3 = 0; i3 < m*m;i3++){sum[i3] = 0;}for (int j = 0; j < n;j++){random_shuffle(a.begin(), a.end());for (int p = 0; p < m;p++){mn[j*m+p] = a[p];}for (int q = 0; q < m;q++){a[q] = q;}}int record=0;for (int t = 0; t < m;t++){int temp = a[t];do {for (int col = 0; col < n; col++){if (mn[col*m + record] == temp){sum[t*m + record]++;}}record++;} while (record<m);record = 0;}for (int c = 0; c < m*m;c+=m){for (int c1 = 0; c1 < m;c1++){cout << sum[c+c1] << "  ";}cout << endl;}}
当m=10,n=1000时:输出结果

983  998  993  996  1057  1006  1011  1028  979  949
1016  1016  992  1025  991  960  956  1011  1000  1033
1012  943  1028  1024  943  1037  972  1009  1052  980
1004  1029  1017  1000  977  978  995  989  979  1032
968  1004  961  1011  1043  1028  1019  954  984  1028
1006  999  992  1032  1019  978  991  980  1008  995
987  932  1035  987  1034  1005  1017  998  972  1033
1066  1005  981  972  967  1035  1019  985  1024  946
942  1041  1004  953  984  1001  1008  1033  993  1041
1016  1033  997  1000  985  972  1012  1013  1009  963