#include<iostream>
#include<vector>
using namespace std;
//选择排序
void selectSort(vector<int>&vec)
{
int n = vec.size();
for (int i = 0; i < n - 1; ++i)
{
int min = i;
for (int j = i + 1; j < n; ++j)
{
if (vec[min] > vec[j])
min = j;
}
if (min != i)
swap(vec[min], vec[i]);
}
}
//冒泡排序
void bulletSort(vector<int>&vec)
{
int n = vec.size();
for (int i = 0; i < n - 1; ++i)
{
bool flag = true;
for (int j = 0; j < n - i - 1; ++j)
{
if (vec[j] > vec[j + 1])
{
swap(vec[j], vec[j + 1]);
flag = false;
}
}
if (flag)
return;
}
}
//插入排序
void insertSort(vector<int>&vec)
{
int n = vec.size();
int j;
for (int i = 1; i < n; ++i)
{
int tmp = vec[i];
for (j = i - 1; j >= 0 && vec[j] > tmp; --j)
vec[j + 1] = vec[j];
vec[j + 1] = tmp;
}
}
//希尔排序
void shellAjust(vector<int>&vec,int gap,int start)
{
int n = vec.size();
int j;
for (int i = start+gap; i < n; i+=gap)
{
int tmp = vec[i];
for (j = i - gap; j >= 0 && vec[j] > tmp; j-=gap)
vec[j + gap] = vec[j];
vec[j + gap] = tmp;
}
}
void shellSort(vector<int>&vec)
{
int n = vec.size();
for (int gap = n / 2; gap > 0; gap /= 2)
{
for (int start = 0; start < gap; start++)
shellAjust(vec,gap,start);
}
}
//堆排序
void heapAjust(vector<int>&vec, int start, int end)
{
int father = start;
int child = 2 * father + 1;
while (child < end)
{
if (child+1<end&&vec[child]<vec[child + 1])
child++;
if (vec[child] > vec[father])
swap(vec[child],vec[father]);
father = child;
child = 2 * father + 1;
}
}
void heapSort(vector<int>&vec)
{
int n = vec.size();
for (int i = n / 2 - 1; i >= 0; --i)
{
heapAjust(vec, i, n);
}
swap(vec[0],vec[--n]);
while (n)
{
heapAjust(vec, 0, n);
swap(vec[0],vec[--n]);
}
}
//归并排序
void merge(vector<int>&vec, int left, int mid, int right)
{
vector<int>help(right - left+1);
int i = left;
int j = mid+1;
int index = 0;
while (i <= left && j <= right)
{
if (vec[i] >= vec[j])
help[index++] = vec[j++];
else
help[index++] = vec[i++];
}
while(i<=mid)
help[index++] = vec[i++];
while(j<=right)
help[index++] = vec[j++];
index = left;
for (int i = 0; i <= right - left; ++i)
vec[index++] = help[i];
}
void mergeSort(vector<int>&vec, int left, int right)
{
if (left >= right)
return;
int mid = (left + right) >> 1;
mergeSort(vec,left,mid);
mergeSort(vec, mid + 1, right);
merge(vec,left,mid,right);
}
//快速排序
void quickSort(vector<int>&vec, int left, int right)
{
if (left > right)
return;
int flag = vec[left];
int i = left;
int j = right;
while (i !=j)
{
//从右边找到小于基准值的值
while (vec[j] > flag&&i < j)
j--;
//从左边找到大于基准值的值
while (vec[i] <= flag&&i < j)
i++;
swap(vec[i], vec[j]);
}
swap(vec[i], vec[left]);
//将中值左右两侧的数据分别进行递归排序
quickSort(vec,left,i-1);
quickSort(vec,i+1,right);
}
//求数据的最大位数,决定排序次数
int maxBit(vector<int>&vec, int n)
{
int d = 1;
int p = 10;
for (int i = 0; i < n; ++i)
{
while (vec[i] >= p)
{
p *= 10;
d++;
}
}
return d;
}
//基数排序
void radixSort(vector<int>&vec, int n)
{
int d = maxBit(vec, n);
vector<int>tmp(n);
int count[10];
int i, j, k;
int radix = 1;
for (int i = 1; i <= d; ++i)
{
for (j = 0; j < 10; ++j)
count[j] = 0;
for (j = 0; j < n; ++j)
{
k = (vec[j]/radix) % 10;
count[k]++;
}
for (j = 1; j < 10; j++)
count[j] = count[j - 1] + count[j];//将tmp中的位置依次分配给每个桶
for (j = n - 1; j >= 0; --j)
{
k = (vec[j] / radix) % 10;
tmp[count[k] - 1] = vec[j];
count[k]--;
}
for (j = 0; j < n; j++)
vec[j] = tmp[j];
radix *= 10;
}
}
int main()
{
vector<int>vec = { 9,8,100,7,6,5,4,3,2,1 ,10,3,2,22};
int n = vec.size();
//selectSort(vec);
//bulletSort(vec);
//insertSort(vec);
//shellSort(vec);
//heapSort(vec);
//mergeSort(vec,0,--n);
//quickSort(vec, 0, --n);
radixSort(vec, n);
for (int i = 0; i < n; ++i)
cout << vec[i] << " ";
}