使用C ++ STL函数改组数组

先决条件: Fisher-Yates算法

随机播放

shuffle()是标头文件算法下的标准库函数,有助于使用生成器随机地对数组中提到的范围进行随机排序。

其内部工作与Fisher-Yates算法完全相似。

唯一增加的是,此函数需要一定的范围来随机播放整个数组。因此,用户可以将所需范围传递给shuffle()函数。另外,除了使用rand()创建用于交换的随机索引外,我们在这里使用生成器函数随机选择要与结束元素(i元素)交换的元素。

shuffle()的语法是,

shuffle(iterator start, iterator end, generator function)

在此,迭代器的开始结束定义了范围。

C ++代码:

#include <bits/stdc++.h>
using namespace std;

int main(){
    cout << "input array size\n";
    int n;
    cin >> n;

    cout << "Input array elements \n";

    vector<int> arr(n);
    for (int i = 0; i < n; i++) {
        cin >> arr[i];
    }

    //整个范围
    //迭代器start = arr.begin()
    //迭代器end = arr.end()
    //生成器函数= default_random_engine
    shuffle(arr.begin(), arr.end(), default_random_engine(0));

    cout << "After reshuffling, printing the array\n";

    for (auto it : arr)
        cout << it << " ";
    cout << endl;

    return 0;
}

输出:

input array size
6
Input array elements
12 43 52 89 5 11
After reshuffling, printing the array
52 12 5 11 43 89

random_shuffling()

random_shuffling()具有相同的目的。

shuffling()是C ++ 11中引入的,之前只有random_shuffling。默认情况下,random_shuffling()rand()作为生成器函数,会导致未指定的随机性。这就是为什么在较新的版本中引入了改组的原因,在该版本中,生成器函数的性能优于rand()。但是,通过重载,我们可以通过用户定义的生成器函数带来与通过random_shuffling()混洗相同的性能。以下是random_shuffling()的示例。

random_shuffling的语法与完全相同shuffling()

1)rand()默认情况下没有任何生成器功能

#include <bits/stdc++.h>
using namespace std;

int main(){
    cout << "input array size\n";
    int n;
    cin >> n;

    cout << "Input array elements \n";

    vector<int> arr(n);
    for (int i = 0; i < n; i++) {
        cin >> arr[i];
    }

    //整个范围
    //迭代器start = arr.begin()
    //迭代器end = arr.end()
    //默认情况下生成器function = rand()
    random_shuffle(arr.begin(), arr.end());
    cout << "After reshuffling, printing the array\n";

    for (auto it : arr)
        cout << it << " ";
    cout << endl;

    return 0;
}

输出:

input array size
6
Input array elements
56 32 45 82 98 13
After reshuffling, printing the array
98 82 32 45 56 13

2)用户定义的生成器

#include <bits/stdc++.h>
using namespace std;

int myrandom(int i)
{
    return rand() % i;
}

int main(){
    cout << "input array size\n";
    int n;
    cin >> n;

    cout << "Input array elements \n";

    vector<int> arr(n);
    for (int i = 0; i < n; i++) {
        cin >> arr[i];
    }

    //整个范围
    //迭代器start = arr.begin()
    //迭代器end = arr.end()
    //默认情况下生成器function = rand()
    random_shuffle(arr.begin(), arr.end(), myrandom);
    cout << "After reshuffling, printing the array\n";

    for (auto it : arr)
        cout << it << " ";
    cout << endl;

    return 0;
}

输出:

input array size
6
Input array elements
32 67 3 8 12 6
After reshuffling, printing the array
12 8 67 3 32 6

值得一提的是,混洗比random_shuffling更好,因为可以使用生成器函数。