#include <iostream>
#include <time.h>
using namespace std;
const long datasize = 1 << 15;
int arr[datasize]{};
clock_t s, e;
void print(int a[], long size);
void BubbleSort(int a[], long size);
void Merge(int arr[], long lo, long mi, long hi);
void MergeSort(int arr[], long lo, long hi);
void InsertSort(int arr[], long size);
void SelectSort(int arr[], long size);
void RadixSort(int arr[], long size);
int Maxbit(int arr[], long size);
void QuickSort(int arr[], long lo, long hi);
int main(int argc, const char * argv[]) {
#if 1
for (long i = 0; i<datasize; i++)
{
arr[i] = rand();
}
s = clock();
BubbleSort(arr, datasize);
e = clock();
//print(arr,datasize);
cout << endl << datasize << " Num-Sortint " << "BubbleSort Using: " << e - s << " us" << endl;
#endif
#if 1
for (long i = 0; i<datasize; i++)
{
arr[i] = rand();
}
s = clock();
InsertSort(arr, datasize);
e = clock();
//print(arr,datasize);
cout << endl << datasize << " Num-Sortint " << "InsertSort Using: " << e - s << " us" << endl;
#endif
#if 1
for (long i = 0; i<datasize; i++)
{
arr[i] = rand();
}
s = clock();
MergeSort(arr, 0, datasize);
e = clock();
//print(arr,datasize);
cout << endl << datasize << " Num-Sortint " << "MergeSort Using: " << e - s << " us" << endl;
#endif
#if 1
for (long i = 0; i<datasize; i++)
{
arr[i] = rand();
}
s = clock();
SelectSort(arr, datasize);
e = clock();
//print(arr,datasize);
cout << endl << datasize << " Num-Sortint " << "SelectSort Using: " << e - s << " us" << endl;
#endif
#if 1
for (long i = 0; i<datasize; i++)
{
arr[i] = rand();
}
s = clock();
QuickSort(arr, 0, datasize);
e = clock();
//print(arr,datasize);
cout << endl << datasize << " Num-Sortint " << "QuickSort Using: " << e - s << " us" << endl;
#endif
#if 1
for (long i = 0; i<datasize; i++)
{
arr[i] = rand();
}
s = clock();
RadixSort(arr, datasize);
e = clock();
//print(arr,datasize);
//cout<<Maxbit(arr, datasize);
cout << endl << datasize << " Num-Sortint " << "RadixSort Using: " << e - s << " us" << endl;
#endif
}
void BubbleSort(int a[], long size)
{
for (long i = 0; i<size; i++)
{
bool flag = true;
for (long j = 0; j<size - i - 1; j++)
{
if (a[j]>a[j + 1])
{
swap(a[j + 1], a[j]);
flag = false;
}
}
if (true == flag)return;
}
}
void MergeSort(int arr[], long lo, long hi)
{
if (hi - lo<2)return;
long mi = (lo + hi) / 2;
MergeSort(arr, lo, mi);
MergeSort(arr, mi, hi);
Merge(arr, lo, mi, hi);
}
void Merge(int arr[], long lo, long mi, long hi)
{
long ml = mi - lo;
int *b = new int[ml];
for (long i = 0; i<ml; i++)b[i] = arr[lo + i];
//print(b, ml);
long x = 0, y = mi;
for (long i = lo; i<hi;)
{
if ((b[x] <= arr[y] && x<ml) || y >= hi)
{
arr[i++] = b[x++];
}
if ((arr[y]<b[x] && y<hi) || x >= ml)
{
arr[i++] = arr[y++];
}
}
delete[]b;
}
void InsertSort(int arr[], long size)
{
for (int i = 1; i<size; i++)
{
int temp = arr[i];
int j = i - 1;
while (j >= 0)
{
if (arr[j]>temp)arr[j + 1] = arr[j];
else { j--; break; }
j--;
}
arr[j + 1] = temp;
}
}
void SelectSort(int arr[], long size)
{
for (long i = size - 1; i >= 0; i--)
{
int maxnum = arr[i];
long rank = i;
for (long j = 0; j<i; j++)
{
if (arr[j] >= maxnum)
{
maxnum = arr[j];
rank = j;
}
}
swap(arr[rank], arr[i]);
}
}
void QuickSort(int arr[], long lo, long hi)
{
if (hi - lo<2)return;
long rank = rand() % (hi - lo) + lo, ranklo = lo, rankhi = hi;
swap(arr[ranklo], arr[rank]);
int key = arr[lo];
hi--;
while (lo<hi)
{
while (lo<hi&&key <= arr[hi])hi--;
arr[lo] = arr[hi];
while (lo<hi&&arr[lo] <= key)lo++;
arr[hi] = arr[lo];
}
arr[lo] = key;
QuickSort(arr, ranklo, lo);
QuickSort(arr, lo + 1, rankhi);
}
void RadixSort(int arr[], long size)
{
int bit = Maxbit(arr, size);
int radix = 1;
int *tmp = new int[size];
int *countn = new int[10];
while (bit--)
{
for (int i = 0; i<10; i++)
{
countn[i] = 0;
}
for (int i = 0; i<size; i++)
{
int k = (arr[i] / radix) % 10;
countn[k]++;
}
for (int i = 1; i<10; i++)
{
countn[i] += countn[i - 1];
}
for (int i = 0; i<size; i++)
{
int k = (arr[i] / radix) % 10;
tmp[countn[k] - 1] = arr[i];
countn[k]--;
}
for (int i = 0; i<size; i++)
{
arr[i] = tmp[i];
}
radix *= 10;
}
delete[]tmp;
tmp = NULL;
delete[]countn;
countn = NULL;
}
int Maxbit(int arr[], long size)
{
int maxnum = 0;
for (int i = 0; i<size; i++)
{
if (arr[i]>maxnum)maxnum = arr[i];
}
//cout<<maxnum<<endl;
int bit = 0;
while (maxnum)
{
maxnum /= 10;
bit++;
}
return bit;
}
void print(int a[], long size)
{
for (long i = 0; i<size; i++)
{
cout << a[i] << " \t";
if (0 == i + 1 % 4)cout << endl;
}
}