随机数取法。
传vector引用会耗时很多。
c语言版:
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
using namespace std;
#include<vector>
//#include<unordered_set>
//#include<unordered_map>
#include<set>
#include<map>
#include<string>
#include<limits.h>
#include<cmath>//
#include<queue>
#include<stack>
#include<numeric>
#include<string.h>
#include<stdio.h>
#include<time.h>
#include <stdlib.h>
#define ll long long
#define endl "\n"
//#define int long long
int n = 1e5;
int arr[500005], arr1[500005];
int getRandom(int l, int r)
{
int ran = rand();
return l + ran % (r - l + 1);
}
void q_s(int l, int r)
{
if (l >= r)return;
int aim = getRandom( l, r);//挖坑法,随机数来选择坑,数学上证明这样总体最快,对于顺序这种极端情况也能接近于nlogn
swap(arr[l], arr[aim]);
aim = arr[l];
int al = l, ar = r;
while (al < ar)
{
while (arr[ar] >= aim && al < ar)
{
ar--;
}
while (arr[al] <= aim && al < ar)
{
al++;
}
swap(arr[al], arr[ar]);
}
swap(arr[l], arr[ar]);
q_s(l, al - 1);
q_s(al + 1, r);
}
void q_sort()
{
srand(time(NULL));
q_s(0,n - 1);
}
void solve()
{
for (int i = 0; i < n; i++)
{
arr[i] = rand();
}
clock_t ct = clock();
q_sort();
ct = clock() - ct;
cout << ct << endl;
}
signed main()
{
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int t = 20;
srand(time(NULL));
//cin >> t;
while (t--)
{
solve();
}
return 0;
}
vector版:
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
using namespace std;
#include<vector>
//#include<unordered_set>
//#include<unordered_map>
#include<set>
#include<map>
#include<string>
#include<limits.h>
#include<cmath>//
#include<queue>
#include<stack>
#include<numeric>
#include<string.h>
#include<stdio.h>
#include<time.h>
#include <stdlib.h>
#define ll long long
#define endl "\n"
//#define int long long
int getRandom(vector<int>& arr, int l, int r)
{
int ran = rand();
return l + ran % (r - l + 1);
}
void q_s(vector<int>& arr, int l, int r)
{
if (l >= r)return;
int aim = getRandom(arr, l, r);//挖坑法,随机数来选择坑,数学上证明这样总体最快,对于顺序这种极端情况也能接近于nlogn
swap(arr[l], arr[aim]);
aim = arr[l];
int al = l, ar = r;
while (al < ar)
{
while (arr[ar] >= aim && al < ar)
{
ar--;
}
while (arr[al] <= aim && al < ar)
{
al++;
}
swap(arr[al], arr[ar]);
}
swap(arr[l], arr[ar]);
q_s(arr, l, al - 1);
q_s(arr, al + 1, r);
}
void q_sort(vector<int>& arr)
{
srand(time(NULL));
q_s(arr, 0, arr.size() - 1);
}
int n = 4e5;
void solve()
{
vector<int>arr(n);
for (int i = 0; i < n; i++)
{
arr[i] = rand();
}
clock_t ct = clock();
q_sort(arr);
ct = clock() - ct;
cout << ct << endl;
}
signed main()
{
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int t = 20;
srand(time(NULL));
//cin >> t;
while (t--)
{
solve();
}
return 0;
}