#include <iostream>
#include <random>
#include <chrono>
#include <ctime>
#include <cstdlib>
#include <algorithm>
#define N 10000
#define R 16
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 *tmp, int n, int exp ) {
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) {
static int *tmp = new int[N];
int m = getMaxValue(arr, n);
int* pages[] = { arr, tmp };
int page_index = 0;
for (int exp = 0; (m >> exp) > 0; exp += 4, page_index^=1)
countSort(pages[page_index], pages[page_index ^ 1], n, exp);
delete[]tmp;
}
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();
//sort(&arr2[0], &arr2[N - 1]);
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+CiNpbmNsdWRlIDxjc3RkbGliPgojaW5jbHVkZSA8YWxnb3JpdGhtPgoKI2RlZmluZSBOCTEwMDAwCiNkZWZpbmUgUgkxNgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmludCBnZXRNYXhWYWx1ZShpbnQgYXJyW10sIGludCBuKSB7CglpbnQgbWF4ID0gMDsKCWZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CgkJbWF4IHw9IGFycltpXTsKCX0KCXJldHVybiBtYXg7Cn0KCnZvaWQgY291bnRTb3J0KGludCogYXJyLCBpbnQgKnRtcCwgaW50IG4sIGludCBleHAgKSB7CglpbnQgbnVtYmVyQ250W1JdID0geyAwIH07CglpbnQgaTsKCglmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQoJCW51bWJlckNudFsoYXJyW2ldID4+IGV4cCkgJiAweEZdKys7CgoJZm9yIChpID0gMTsgaSA8IFI7IGkrKykKCQludW1iZXJDbnRbaV0gKz0gbnVtYmVyQ250W2kgLSAxXTsKCglmb3IgKGkgPSBuIC0gMTsgaSA+PSAwOyBpLS0pIHsKCQl0bXBbbnVtYmVyQ250WyhhcnJbaV0gPj4gZXhwKSAmIDB4Rl0gLSAxXSA9IGFycltpXTsKCQludW1iZXJDbnRbKGFycltpXSA+PiBleHApICYgMHhGXS0tOwoJfQoKCS8vZm9yIChpID0gMDsgaSA8IG47IGkrKykKCS8vCWFycltpXSA9IHRtcFtpXTsKfQoKdm9pZCByYWRpeFNvcnQoaW50IGFycltdLCBpbnQgbikgewoJc3RhdGljIGludCAqdG1wID0gbmV3IGludFtOXTsKCglpbnQgbSA9IGdldE1heFZhbHVlKGFyciwgbik7CglpbnQqIHBhZ2VzW10gPSB7IGFyciwgdG1wIH07CQoJaW50IHBhZ2VfaW5kZXggPSAwOwoJCglmb3IgKGludCBleHAgPSAwOyAobSA+PiBleHApID4gMDsgZXhwICs9IDQsIHBhZ2VfaW5kZXhePTEpCgkJY291bnRTb3J0KHBhZ2VzW3BhZ2VfaW5kZXhdLCBwYWdlc1twYWdlX2luZGV4IF4gMV0sIG4sIGV4cCk7CgoJZGVsZXRlW110bXA7Cn0KCnZvaWQgcHJpbnQoaW50IGFycltdLCBpbnQgbikgewoJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIAoJCWNvdXQgPDwgYXJyW2ldIDw8ICIgIjsKCQoJY291dCA8PCBlbmRsOwp9CgppbnQgY29tcGFyZShjb25zdCB2b2lkICpmaXJzdCwgY29uc3Qgdm9pZCAqc2Vjb25kKSB7CglpZiAoKihpbnQqKWZpcnN0ID4gKihpbnQqKXNlY29uZCkKCQlyZXR1cm4gMTsKCWVsc2UgaWYgKCooaW50KilmaXJzdCA8ICooaW50KilzZWNvbmQpCgkJcmV0dXJuIC0xOwoJZWxzZQoJCXJldHVybiAwOwp9CgppbnQgbWFpbih2b2lkKSB7CgoJLy9pbnQgYXJyW05dID0geyA4OSw3MCwzNSwxMzEsOTEwIH07CglpbnQgYXJyW05dOwoJaW50IGFycjJbTl07CgoJY2hyb25vOjpzeXN0ZW1fY2xvY2s6OnRpbWVfcG9pbnQgU3RhcnRUaW1lLCBFbmRUaW1lOwoJY2hyb25vOjptaWNyb3NlY29uZHMgbWljcm87CgoJbXQxOTkzNyBybmQoKHVuc2lnbmVkKXRpbWUoTlVMTCkpOwoJdW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPGludD4gZGlzdCgwLCA5OTk5KTsKCglmb3IgKGludCBrID0gMDsgayA8IDE7IGsrKykgewoJCWZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKQoJCQlhcnJbaV0gPSBkaXN0KHJuZCk7CgoJCW1lbWNweShhcnIyLCBhcnIsIHNpemVvZihpbnQpKk4pOwoKCQlpbnQgbiA9IHNpemVvZihhcnIpIC8gc2l6ZW9mKGludCk7CgoJCVN0YXJ0VGltZSA9IGNocm9ubzo6c3lzdGVtX2Nsb2NrOjpub3coKTsKCQlyYWRpeFNvcnQoYXJyLCBuKTsKCQlFbmRUaW1lID0gY2hyb25vOjpzeXN0ZW1fY2xvY2s6Om5vdygpOwoJCW1pY3JvID0gY2hyb25vOjpkdXJhdGlvbl9jYXN0PGNocm9ubzo6bWljcm9zZWNvbmRzPihFbmRUaW1lIC0gU3RhcnRUaW1lKTsKCQljb3V0IDw8ICJSYWRpeCBTb3J0IDogIiA8PCBtaWNyby5jb3VudCgpIDw8ICLOvHMsICI7CgoJCVN0YXJ0VGltZSA9IGNocm9ubzo6c3lzdGVtX2Nsb2NrOjpub3coKTsKCQkvL3NvcnQoJmFycjJbMF0sICZhcnIyW04gLSAxXSk7CgkJcXNvcnQoYXJyMiwgTiwgc2l6ZW9mKGludCksIGNvbXBhcmUpOwoJCUVuZFRpbWUgPSBjaHJvbm86OnN5c3RlbV9jbG9jazo6bm93KCk7CgkJbWljcm8gPSBjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8Y2hyb25vOjptaWNyb3NlY29uZHM+KEVuZFRpbWUgLSBTdGFydFRpbWUpOwoJCWNvdXQgPDwgInFzb3J0IEZ1bmN0aW9uIDogIiA8PCBtaWNyby5jb3VudCgpIDw8ICLOvHMiIDw8IGVuZGw7CgoJCXByaW50KGFyciwgbik7CgkJLy9wcmludChhcnIyLCBuKTsKCX0KCglyZXR1cm4gMDsKfQoKCg==