1.思路:
创建一个结构体{int, int*},前者为随机生成的整数,后者保存对应位数组的地址,再对前者进行插入排序,排序完后者对应的数组值即达到随机打散的目的,代码如下:
#include <iostream>
#include <ctime>
#include <windows.h>
using namespace std;
struct Nodes {
int nValue;
int *pnValue;
} pnodeArr;
void InitArr(int* nArr, int nLen) { //初始化数组
srand(time(NULL));
for(int i = 0; i < nLen; ++i) {
//nArr[i] = rand() % 100;
nArr[i] = i;
}
}
void PrintArr(int* pnArr, int nLen) { //打印数组
for(int i = 0; i < nLen; ++i) {
cout << pnArr[i] << " ";
}
cout << endl;
}
void InsertSort(Nodes* pnodeArr, int nLen) { //对Nodes.nValue进行插入排序
for(int i = 1; i < nLen; ++i) {
Nodes tmp = pnodeArr[i];
int j;
for(j = i - 1; j >= 0 && tmp.nValue < pnodeArr[j].nValue; --j) {
pnodeArr[j + 1] = pnodeArr[j];
}
pnodeArr[j + 1] = tmp;
}
}
void RandomArr(int *pnArr, int nLen) {
int i;
Nodes *pnodeArr = new Nodes[nLen];
int *pnArrTmp = new int[nLen];
srand(time(NULL));
for(i = 0; i < nLen; ++i) {
pnArrTmp[i] = pnArr[i];
pnodeArr[i].nValue = rand() % 1000; //Nodes.nValue是随机生成
pnodeArr[i].pnValue = &pnArrTmp[i]; //Nodes.pnValue用来记录原始数据的地址
}
InsertSort(pnodeArr, nLen); //插入排序
for(i = 0; i < nLen; ++i) {
pnArr[i] = *(pnodeArr[i].pnValue);
}
delete [] pnArrTmp;
delete [] pnodeArr;
}
int main() {
int nLen = 10;
int nArr[nLen];
InitArr(nArr, nLen);
PrintArr(nArr, nLen);
cout << endl;
int T = 10;
while(T--) { //输出10次随机排序的结果
srand(time(NULL));
RandomArr(nArr, nLen);
PrintArr(nArr, nLen);
Sleep(2000); //等待2s,更新随机种子
}
return 0;
}
2.输出结果: