#include<stdio.h>
#define N 100
//插入排序法:
void insert(int *a,int n);
//希尔排序
void gap(int *a,int n);
void show(int *a,int n);
void swap(int *a,int *b);
//选择排序
void choose(int *a,int n);
//冒泡排序
void mao(int *a,int n);
int main()
{
int a[N],n;
printf("How many numbers do you want to enter?\n");
scanf("%d",&n);
printf("input data:\n");
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
// insert(a,n);
// gap(a,n);
choose(a,n);
// mao(a,n);
show(a,n);
}
void insert(int *a,int n)
{
//从第一个元素开始,这个元素可以认为已经被排序
//记录这个元素后面的元素,并把记录的这个视为要插入的
//需要进行n-1-1次判断
for(int i=0;i<n-1;i++)
{
int end=i;//标记有顺序的元素下标
int tem=a[end+1];//记录最后有序的元素的下一位
while(end>=0)//有序的数有至少一个
{
if(tem<a[end])
{
a[end+1]=a[end];
end--;
//end--,end必须--,因为if,else两种情况下,交换不交换不一定
}
else
break;
}
a[end+1]=tem;//end已经--了
//a[end];不能这样
}
}
void show(int *a,int n)
{
for(int i=0;i<n;i++)
{
printf("%d ",*(a+i));
}
}
//希尔排序
void gap(int *a,int n)
{
int gap=n;
while(gap>1)
{
gap=gap/2;
for(int i=0;i<n-gap;i++)
{
int end=i;//记录有顺序的元素下标
int tem=a[end+gap];//记录要比较的数
while(end>=0)
{
if(tem<a[end])
{
a[end+gap]=a[end];
end-=gap;
}
else
break;
}
a[end+gap]=tem;
}
}
}
//选择排序
void choose(int *a,int n)
{
int begin=0,end=n-1;
while(begin<end)
{
int max=begin;
int min=begin;
//找出最值的下标
for(int i=begin;i<=end;++i)
{
if(a[i]>a[max])
max=i;
if(a[i]<a[min])
min=i;
}
//最小值放到开头,和开头交换
swap(&a[min],&a[begin]);
if(begin==max)
max=min;
//最大值放到末尾
swap(&a[max],&a[end]);
++begin;
--end;
}
}
void swap(int *a,int *b)
{
int tem=*a;
*a=*b;
*b=tem;
}
//冒泡排序法
void mao(int *a,int n)
{
int end=n;
while(end)
{
int flag=0;
for(int i=1;i<end;++i)
{
if(a[i-1]>a[i])
{
int tem=a[i];
a[i]=a[i-1];
a[i-1]=tem;
flag=1;//两个交换了数值
}
}
if(flag==0)//本就是增序排列的
break;
--end;
}
}