打乱(shuffling)

本文介绍了一种简单有效的数组打乱算法,通过遍历数组并与随机位置元素交换的方式实现,时间复杂度仅为O(n)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

前面已经学习了好多排序的算法,那怎样才能将一个排列好的数组打乱呢?(感觉自己好作啊,先排序,再打乱,在排序。。。)

下面就来学习一下打乱算法和其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上普林斯顿大学的算法课点击打开链接

 

 

以上内容纯属个人学习总结,不代表任何团体或单位。若有理解不到之处请见谅!

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值