#include <iostream>
#include <random>
#include <chrono>
#include <ctime>
#include <cstdlib>
#define N 1000
#define R 0xF
using namespace std;
int getMaxValue(int arr[], int n) {
int max = 0;
for (int i = 0; i < N; i++) {
max |= arr[i];
}
return max;
}
void countSort(int arr[], int n, int exp) {
static int tmp[N];
int numberCnt[R] = { 0 };
int i;
for (i = 0; i < n; i++)
numberCnt[(arr[i] >> exp) & 0xF]++;
for (i = 1; i < R; i++)
numberCnt[i] += numberCnt[i - 1];
for (i = n - 1; i >= 0; i--) {
tmp[numberCnt[(arr[i] >> exp) & 0xF] - 1] = arr[i];
numberCnt[(arr[i] >> exp) & 0xF]--;
}
for (i = 0; i < n; i++)
arr[i] = tmp[i];
}
void radixSort(int arr[], int n) {
int m = getMaxValue(arr, n);
for (int exp = 0; (m >> exp) > 0; exp += 4)
countSort(arr, n, exp);
}
void print(int arr[], int n) {
for (int i = 0; i < n; i++)
cout << arr[i] << " ";
cout << endl;
}
int compare(const void *first, const void *second) {
if (*(int*)first > *(int*)second)
return 1;
else if (*(int*)first < *(int*)second)
return -1;
else
return 0;
}
int main(void) {
//int arr[N] = { 89,70,35,131,910 };
int arr[N];
int arr2[N];
chrono::system_clock::time_point StartTime, EndTime;
chrono::microseconds micro;
mt19937 rnd((unsigned)time(NULL));
uniform_int_distribution<int> dist(0, 9999);
for (int k = 0; k < 1; k++) {
for (int i = 0; i < N; i++)
arr[i] = dist(rnd);
memcpy(arr2, arr, sizeof(int)*N);
int n = sizeof(arr) / sizeof(int);
StartTime = chrono::system_clock::now();
radixSort(arr, n);
EndTime = chrono::system_clock::now();
micro = chrono::duration_cast<chrono::microseconds>(EndTime - StartTime);
cout << "Radix Sort : " << micro.count() << "μs, ";
StartTime = chrono::system_clock::now();
qsort(arr2, N, sizeof(int), compare);
EndTime = chrono::system_clock::now();
micro = chrono::duration_cast<chrono::microseconds>(EndTime - StartTime);
cout << "qsort Function : " << micro.count() << "μs" << endl;
//print(arr, n);
//print(arr2, n);
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8cmFuZG9tPgojaW5jbHVkZSA8Y2hyb25vPgojaW5jbHVkZSA8Y3RpbWU+CiNpbmNsdWRlIDxjc3RkbGliPgoKI2RlZmluZSBOCTEwMDAKI2RlZmluZSBSCTB4RgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmludCBnZXRNYXhWYWx1ZShpbnQgYXJyW10sIGludCBuKSB7CglpbnQgbWF4ID0gMDsKCWZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CgkJbWF4IHw9IGFycltpXTsKCX0KCXJldHVybiBtYXg7Cn0KCnZvaWQgY291bnRTb3J0KGludCBhcnJbXSwgaW50IG4sIGludCBleHApIHsKCXN0YXRpYyBpbnQgdG1wW05dOwoJaW50IG51bWJlckNudFtSXSA9IHsgMCB9OwoJaW50IGk7CgoJZm9yIChpID0gMDsgaSA8IG47IGkrKykKCQludW1iZXJDbnRbKGFycltpXSA+PiBleHApICYgMHhGXSsrOwoKCWZvciAoaSA9IDE7IGkgPCBSOyBpKyspCgkJbnVtYmVyQ250W2ldICs9IG51bWJlckNudFtpIC0gMV07CgoJZm9yIChpID0gbiAtIDE7IGkgPj0gMDsgaS0tKSB7CgkJdG1wW251bWJlckNudFsoYXJyW2ldID4+IGV4cCkgJiAweEZdIC0gMV0gPSBhcnJbaV07CgkJbnVtYmVyQ250WyhhcnJbaV0gPj4gZXhwKSAmIDB4Rl0tLTsKCX0KCglmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQoJCWFycltpXSA9IHRtcFtpXTsKfQoKdm9pZCByYWRpeFNvcnQoaW50IGFycltdLCBpbnQgbikgewoJaW50IG0gPSBnZXRNYXhWYWx1ZShhcnIsIG4pOwoKCWZvciAoaW50IGV4cCA9IDA7IChtID4+IGV4cCkgPiAwOyBleHAgKz0gNCkKCQljb3VudFNvcnQoYXJyLCBuLCBleHApOwp9Cgp2b2lkIHByaW50KGludCBhcnJbXSwgaW50IG4pIHsKCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSAKCQljb3V0IDw8IGFycltpXSA8PCAiICI7CgkKCWNvdXQgPDwgZW5kbDsKfQoKaW50IGNvbXBhcmUoY29uc3Qgdm9pZCAqZmlyc3QsIGNvbnN0IHZvaWQgKnNlY29uZCkgewoJaWYgKCooaW50KilmaXJzdCA+ICooaW50KilzZWNvbmQpCgkJcmV0dXJuIDE7CgllbHNlIGlmICgqKGludCopZmlyc3QgPCAqKGludCopc2Vjb25kKQoJCXJldHVybiAtMTsKCWVsc2UKCQlyZXR1cm4gMDsKfQoKaW50IG1haW4odm9pZCkgewoKCS8vaW50IGFycltOXSA9IHsgODksNzAsMzUsMTMxLDkxMCB9OwoJaW50IGFycltOXTsKCWludCBhcnIyW05dOwoKCWNocm9ubzo6c3lzdGVtX2Nsb2NrOjp0aW1lX3BvaW50IFN0YXJ0VGltZSwgRW5kVGltZTsKCWNocm9ubzo6bWljcm9zZWNvbmRzIG1pY3JvOwoKCW10MTk5Mzcgcm5kKCh1bnNpZ25lZCl0aW1lKE5VTEwpKTsKCXVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjxpbnQ+IGRpc3QoMCwgOTk5OSk7CgoJZm9yIChpbnQgayA9IDA7IGsgPCAxOyBrKyspIHsKCQlmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykKCQkJYXJyW2ldID0gZGlzdChybmQpOwoKCQltZW1jcHkoYXJyMiwgYXJyLCBzaXplb2YoaW50KSpOKTsKCgkJaW50IG4gPSBzaXplb2YoYXJyKSAvIHNpemVvZihpbnQpOwoKCQlTdGFydFRpbWUgPSBjaHJvbm86OnN5c3RlbV9jbG9jazo6bm93KCk7CgkJcmFkaXhTb3J0KGFyciwgbik7CgkJRW5kVGltZSA9IGNocm9ubzo6c3lzdGVtX2Nsb2NrOjpub3coKTsKCQltaWNybyA9IGNocm9ubzo6ZHVyYXRpb25fY2FzdDxjaHJvbm86Om1pY3Jvc2Vjb25kcz4oRW5kVGltZSAtIFN0YXJ0VGltZSk7CgkJY291dCA8PCAiUmFkaXggU29ydCA6ICIgPDwgbWljcm8uY291bnQoKSA8PCAizrxzLCAiOwoKCQlTdGFydFRpbWUgPSBjaHJvbm86OnN5c3RlbV9jbG9jazo6bm93KCk7CgkJcXNvcnQoYXJyMiwgTiwgc2l6ZW9mKGludCksIGNvbXBhcmUpOwoJCUVuZFRpbWUgPSBjaHJvbm86OnN5c3RlbV9jbG9jazo6bm93KCk7CgkJbWljcm8gPSBjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8Y2hyb25vOjptaWNyb3NlY29uZHM+KEVuZFRpbWUgLSBTdGFydFRpbWUpOwoJCWNvdXQgPDwgInFzb3J0IEZ1bmN0aW9uIDogIiA8PCBtaWNyby5jb3VudCgpIDw8ICLOvHMiIDw8IGVuZGw7CgoJCS8vcHJpbnQoYXJyLCBuKTsKCQkvL3ByaW50KGFycjIsIG4pOwoJfQoKCXJldHVybiAwOwp9CgoK