#include <iostream>
#include <random>
#include <chrono>
#include <ctime>
#include <cstdlib>
#define N 10000
#define R 0xF
#define R_4 4
using namespace std;
int getMaxValue(int arr[], int n) {
int max = arr[0];
for (int i = 1; i < N; i++) {
if (arr[i] > max)
max = arr[i];
}
return max;
}
void countSort(int arr[], int n, int exp) {
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 < 20; 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+CiNpbmNsdWRlIDxjc3RkbGliPgoKI2RlZmluZSBOCTEwMDAwCiNkZWZpbmUgUgkweEYKI2RlZmluZSBSXzQJNAoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmludCBnZXRNYXhWYWx1ZShpbnQgYXJyW10sIGludCBuKSB7CglpbnQgbWF4ID0gYXJyWzBdOwoKCWZvciAoaW50IGkgPSAxOyBpIDwgTjsgaSsrKSB7CgkJaWYgKGFycltpXSA+IG1heCkKCQkJbWF4ID0gYXJyW2ldOwoJfQoJcmV0dXJuIG1heDsKfQoKdm9pZCBjb3VudFNvcnQoaW50IGFycltdLCBpbnQgbiwgaW50IGV4cCkgewoJaW50IHRtcFtOXTsKCWludCBudW1iZXJDbnRbUl0gPSB7IDAgfTsKCWludCBpOwoKCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCgkJbnVtYmVyQ250WyhhcnJbaV0gPj4gZXhwKSAmIDB4Rl0rKzsKCglmb3IgKGkgPSAxOyBpIDwgUjsgaSsrKQoJCW51bWJlckNudFtpXSArPSBudW1iZXJDbnRbaSAtIDFdOwoKCWZvciAoaSA9IG4gLSAxOyBpID49IDA7IGktLSkgewoJCXRtcFtudW1iZXJDbnRbKGFycltpXSA+PiBleHApICYgMHhGXSAtIDFdID0gYXJyW2ldOwoJCW51bWJlckNudFsoYXJyW2ldID4+IGV4cCkgJiAweEZdLS07Cgl9CgoJZm9yIChpID0gMDsgaSA8IG47IGkrKykKCQlhcnJbaV0gPSB0bXBbaV07Cn0KCnZvaWQgcmFkaXhTb3J0KGludCBhcnJbXSwgaW50IG4pIHsKCWludCBtID0gZ2V0TWF4VmFsdWUoYXJyLCBuKTsKCglmb3IgKGludCBleHAgPSAwOyAobSA+PiBleHApID4gMDsgZXhwICs9IDQpCgkJY291bnRTb3J0KGFyciwgbiwgZXhwKTsKfQoKdm9pZCBwcmludChpbnQgYXJyW10sIGludCBuKSB7Cglmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewoJCWNvdXQgPDwgYXJyW2ldIDw8ICIgIjsKCX0KCWNvdXQgPDwgZW5kbDsKfQoKaW50IGNvbXBhcmUoY29uc3Qgdm9pZCAqZmlyc3QsIGNvbnN0IHZvaWQgKnNlY29uZCkgewoJaWYgKCooaW50KilmaXJzdCA+ICooaW50KilzZWNvbmQpCgkJcmV0dXJuIDE7CgllbHNlIGlmICgqKGludCopZmlyc3QgPCAqKGludCopc2Vjb25kKQoJCXJldHVybiAtMTsKCWVsc2UKCQlyZXR1cm4gMDsKfQoKaW50IG1haW4odm9pZCkgewoKCS8vaW50IGFycltOXSA9IHsgODksNzAsMzUsMTMxLDkxMCB9OwoJaW50IGFycltOXTsKCWludCBhcnIyW05dOwoKCWNocm9ubzo6c3lzdGVtX2Nsb2NrOjp0aW1lX3BvaW50IFN0YXJ0VGltZSwgRW5kVGltZTsKCWNocm9ubzo6bWljcm9zZWNvbmRzIG1pY3JvOwoKCW10MTk5Mzcgcm5kKCh1bnNpZ25lZCl0aW1lKE5VTEwpKTsKCXVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjxpbnQ+IGRpc3QoMCwgOTk5OSk7CgoJZm9yIChpbnQgayA9IDA7IGsgPCAyMDsgaysrKSB7CgkJZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspCgkJCWFycltpXSA9IGRpc3Qocm5kKTsKCgkJbWVtY3B5KGFycjIsIGFyciwgc2l6ZW9mKGludCkqTik7CgoJCWludCBuID0gc2l6ZW9mKGFycikgLyBzaXplb2YoaW50KTsKCgkJU3RhcnRUaW1lID0gY2hyb25vOjpzeXN0ZW1fY2xvY2s6Om5vdygpOwoJCXJhZGl4U29ydChhcnIsIG4pOwoJCUVuZFRpbWUgPSBjaHJvbm86OnN5c3RlbV9jbG9jazo6bm93KCk7CgkJbWljcm8gPSBjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8Y2hyb25vOjptaWNyb3NlY29uZHM+KEVuZFRpbWUgLSBTdGFydFRpbWUpOwoJCWNvdXQgPDwgIlJhZGl4IFNvcnQgOiAiIDw8IG1pY3JvLmNvdW50KCkgPDwgIs68cywgIjsKCgkJU3RhcnRUaW1lID0gY2hyb25vOjpzeXN0ZW1fY2xvY2s6Om5vdygpOwoJCXFzb3J0KGFycjIsIE4sIHNpemVvZihpbnQpLCBjb21wYXJlKTsKCQlFbmRUaW1lID0gY2hyb25vOjpzeXN0ZW1fY2xvY2s6Om5vdygpOwoJCW1pY3JvID0gY2hyb25vOjpkdXJhdGlvbl9jYXN0PGNocm9ubzo6bWljcm9zZWNvbmRzPihFbmRUaW1lIC0gU3RhcnRUaW1lKTsKCQljb3V0IDw8ICJxc29ydCBGdW5jdGlvbiA6ICIgPDwgbWljcm8uY291bnQoKSA8PCAizrxzIiA8PCBlbmRsOwoKCQkvL3ByaW50KGFyciwgbik7CgkJLy9wcmludChhcnIyLCBuKTsKCX0KCglyZXR1cm4gMDsKfQoKCg==