📅  最后修改于: 2023-12-03 15:06:12.060000             🧑  作者: Mango
该问题可以采用洗牌算法(Shuffle Algorithm)实现,该算法时间复杂度为 O(n)。
以下为 Python 代码实现:
import random
def shuffle(nums):
n = len(nums) // 2
for i in range(n):
j = random.randrange(i, 2*n)
nums[i], nums[j] = nums[j], nums[i]
return nums
nums = [1,2,3,4,5,6]
print(shuffle(nums))
以下为 C++ 代码实现:
#include <iostream>
#include <cstdlib>
using namespace std;
void shuffle(int nums[], int n) {
for (int i = 0; i < n; i++) {
int j = rand() % (2*n-i) + i;
swap(nums[i], nums[j]);
}
}
int main() {
int nums[] = {1,2,3,4,5,6};
int n = sizeof(nums) / sizeof(int) / 2;
shuffle(nums, n);
for (int i = 0; i < 2*n; i++) {
cout << nums[i] << " ";
}
cout << endl;
return 0;
}
洗牌算法的时间复杂度为 O(n),空间复杂度为 O(1)。该算法采用了原地交换的方法,不需要使用额外的数组或链表,因此空间复杂度为常数级别。另外,该算法的时间复杂度比较优秀,只需要进行 n 次随机交换即可将 2n 个整数打乱。由于该算法是随机的,因此每次运行的结果都是不同的,可以有效地防止数据泄露等问题。