前言
前面已经学习了好多排序的算法,那怎样才能将一个排列好的数组打乱呢?(感觉自己好作啊,先排序,再打乱,在排序。。。)
下面就来学习一下打乱算法和其c++代码:
打乱算法
打乱算法有许多种,举个例子,这里有排列好的1到10的扑克牌,我们将其反过来,在每一张的背面随机写上1到10之间的数,然后再对背面的数进行排序,排好之后再翻回正面,相信已经打的很乱了。但这样需要排序,耗费时间又耗费内存,那么有更简单的算法吗?
当然有,对于一列数,取一个指针从头开始往后指,每指到一个数,将其与数列中随机的一个数交换,这样当指针到达数列最后时,数列也已经打乱。
来看看c++代码:
void shuffle(int numbers[], int count){ //numbers[] is the array
int i, j, temp; //count is the length of array
srand((unsigned)time(NULL));
for(i = 0; i < count; i++){
j = rand() % count;
temp = numbers[i];
numbers[i] = numbers[j]; //exchange
numbers[j] = temp;
}
for(i = 0; i < count; i++){
cout << numbers[i] << " ";
}
cout << endl;
}
运行一下:
#include <iostream>
#include <random>
using namespace std;
int main()
{
int num[8] = {0, 1, 2, 3, 4, 5, 6, 7};
shuffle(num, 8);
}
原数列:0, 1, 2, 3, 4, 5, 6, 7
打乱后:5,2,3,6,7,1,4,0
总结
相比于之前讲到的,这样的打乱算法时间复杂度只有O(n),十分快捷有效。
最后强烈推荐Coursera上普林斯顿大学的算法课点击打开链接
以上内容纯属个人学习总结,不代表任何团体或单位。若有理解不到之处请见谅!