include <stdio.h>
//交换数字 ,这里如果不用指针就会导致数值只会在函数体里交换
void swap(int* x, int* y)
{
int mid;
mid = *x;
*x = *y;
*y = mid;
}
//选择排序
void Selection_sort(int a[],int n)
{
int mid;
for(int i=n-1;i>0;i--)
{
int maxIdx=i;
for(int j=0;j<i;j++)
{
if(a[j]>a[i])
{
maxIdx=j;
mid=a[i];
a[i]=a[maxIdx];
a[maxIdx]=mid;
} //这里直接交换也可以
swap(&a[i],&a[j]);}
}
}
//冒泡排序
void Bubble_sort(int a[],int n)
{
for(int i=0;i<n;i++)
{
bool is_sort=true;//改进算法,如果一次没有交换则说明已经排好
for(int j=0;j<n-i-1;j++)
{
if (a[j] > a[j + 1]) {
swap(&a[j], &a[j + 1]);
is_sort = false;
}
}
if(is_sort) return;
}
}
//插入排序
void insertion_sort(int a[],int n)
{
for(int i=1;i<n;i++)
{
int next=a[i];
int j;
for(j=i-1;j>=0&&a[j]>next;j--)// 检索在a[i]之前的数,在两个数之间插进去
{
a[j+1]=a[j];
}
a[j+1]=next;//注意赋值的位置
}
}
//归并算法的核心,两个有顺序的数组合并排序时,只要按顺序比大小即可 ,一组比完剩下的就直接排上
void Merge(int a[],int low,int mid,int high)
{
int n=high-low+1;
int *b=new int[n];//存一个临时数组来放置比较的结果
int left=low,right=mid+1,bIdx=0;
while(left<=mid&&right<=high)
{
if(a[left]<=a[right]) b[bIdx++]=a[left++];
else b[bIdx++]=a[right++];
}
while(left<=mid) b[bIdx++]=a[left++];
while(right<=high) b[bIdx++]=a[right++];
for(int k=0;k<n;k++)
{
a[low+k]=b[k];
}
delete [] b;
}
//函数递归的方法
void Merge_sort(int a[],int low,int high)
{
if(low<high)
{
int mid=(low+high)/2;
Merge_sort(a,low,mid);
Merge_sort(a,mid+1,high);
Merge(a,low,mid,high);
}
}
int main(void)
{
int len = 0, num;
int a[100] = { 0 };
while (1)
{
scanf("%d", &num);
a[len++] = num;
if (getchar() == '\n') break;
}
//调用想使用的算法进行排序
Ways_sort(a, 0, len - 1);//
for (int i = 0; i < len; i++) printf("%d ", a[i]);
}