#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <map>
#include <vector>
#include <set>
#include <queue>
#include <stack>
#include <math.h>
using namespace std;
struct ListNode
{
int value;
ListNode* next;
ListNode(int value)
{
this->value = value;
}
};
void BubbleSort(vector<int> &array)
{
int len = array.size();
for(int i=0;i<len;i++)
{
int tag=0;
for(int j=0;j<len-i-1;j++)
{
if(array[j]>array[j+1])
{
swap(array[j],array[j+1]);
tag=1;
}
}
if(!tag)
break;
}
}
void SelectionSort(vector<int> &array)
{
int len = array.size();
for(int i=0;i<len;i++)
{
int m = i;
for(int j=i+1;j<len;j++)
{
if(array[m]>array[j])
{
m=j;
}
}
swap(array[i],array[m]);
}
}
void InsertSort(vector<int> &array)
{
int len = array.size();
for(int i=0;i<len;i++)
{
for(int j=i;j>0;j--)
{
if(array[j]<array[j-1])
{
swap(array[j],array[j-1]);
}
else
break;
}
}
}
void ShellSort(vector<int> &array)
{
int len = array.size();
int distance = len / 2;
while(distance)
{
for(int i=0;i<distance;i++)
{
for(int j=i;j<len;j+=distance)
{
for(int k=j;k>i;k-=distance)
{
if(array[k]<array[k-distance])
{
swap(array[k],array[k-distance]);
}
else
break;
}
}
}
distance/=2;
}
}
void CountSort(vector<int> &array)
{
int maxNum=array[0];
int len = array.size();
for(int i=1;i<len;i++)
{
maxNum = max(maxNum,array[i]);
}
int count[maxNum+1];
memset(count,0, sizeof(count));
for(int i=0;i<len;i++)
{
count[array[i]]++;
}
array.clear();
for(int i=0;i<=maxNum;i++)
{
while(count[i]) {
array.push_back(i);
count[i]--;
}
}
}
void BucketSort(vector<int>& array)
{
int len = array.size();
if(len<=1)
return;
int minNum = array[0];
int maxNum = array[0];
for(int i=1;i<len;i++)
{
minNum = min(minNum,array[i]);
maxNum = max(maxNum,array[i]);
}
if(minNum==maxNum)
return;
int n=1;
int len2 = maxNum-minNum+1;
if(len2>5)
{
n=2;
len2 = (maxNum-minNum+1)/n + 1;
}
vector<int> buckets[len2];
for(int i=0;i<len;i++)
{
buckets[(array[i]-minNum)/n].push_back(array[i]);
}
for(int i=0;i<len2;i++)
{
BucketSort(buckets[i]);
}
array.clear();
for(int i=0;i<len2;i++)
{
for(int j=0;j<buckets[i].size();j++)
{
array.push_back(buckets[i][j]);
}
}
}
int getdigitNum(int x)
{
int res=0;
while(x)
{
x/=10;
res++;
}
return res;
}
int getdigit(int x,int i)
{
while(i)
{
x/=10;
i--;
}
return x%10;
}
void radixSort(vector<int>& array)
{
vector<int> a[10];
int len = array.size();
int times =0;
for(int i=0;i<len;i++)
{
times = max(times,getdigitNum(array[i]));
}
for(int i=0;i<times;i++)
{
for(int j=0;j<10;j++)
a[j].clear();
for(int j=0;j<len;j++)
{
int number = getdigit(array[j],i);
a[number].push_back(array[j]);
}
array.clear();
for(int j=0;j<10;j++)
{
for(int k=0;k<a[j].size();k++)
array.push_back(a[j][k]);
}
}
}
#define MAX 100
int b[MAX];
void init2()
{
for(int i=0;i<MAX;i++)
{
b[i]=rand() % 100000;
}
}
void init(vector<int>& array)
{
array.clear();
for(int i=0;i<MAX;i++)
{
array.push_back(b[i]);
}
}
int main()
{
init2();
vector<int> array;
init(array);
BubbleSort(array);
for(int i=0;i<array.size();i++)
{
cout<<array[i]<<" ";
}
cout<<endl;
init(array);
SelectionSort(array);
for(int i=0;i<array.size();i++)
{
cout<<array[i]<<" ";
}
cout<<endl;
init(array);
InsertSort(array);
for(int i=0;i<array.size();i++)
{
cout<<array[i]<<" ";
}
cout<<endl;
init(array);
ShellSort(array);
for(int i=0;i<array.size();i++)
{
cout<<array[i]<<" ";
}
cout<<endl;
init(array);
CountSort(array);
for(int i=0;i<array.size();i++)
{
cout<<array[i]<<" ";
}
cout<<endl;
init(array);
BucketSort(array);
for(int i=0;i<array.size();i++)
{
cout<<array[i]<<" ";
}
cout<<endl;
init(array);
radixSort(array);
for(int i=0;i<array.size();i++)
{
cout<<array[i]<<" ";
}
cout<<endl;
}