题目:给定整数序列 [29, 10, 14, 37, 13],请进行升序排序
1.选择排序
何为选择排序?
从i到n-1范围上,找到最小值并放在i位置,然后在i+1~n-1范围上继续
过程推理:针对此题来说,一共有五个数字,一共四轮:第一轮,从索引0开始,把它当作最小值,然后依次与后面几位进行比较,如果有比其小的,则更改索引,全部比较完成一遍之后,把第0位置与索引位置交换;第二轮从索引1开始……以此类推
int main()
{
int arr[10];
int i,j;
int temp;
int n;
scanf("%d",&n);
int minindex;
for(i=0;i<n;i++)
{
scanf("%d",&arr[i]);
}
for(i=0;i<n-1;i++)//共几轮
{
minindex=i;
for(j=i+1;j<=n-1;j++)
{
if(arr[minindex]>arr[j])
{
minindex=j;
}
}
temp=arr[minindex];
arr[minindex]=arr[i];
arr[i]=temp;
}
for(i=0;i<n;i++)
printf("%d ",arr[i]);
return 0;
}
2.冒泡排序
何为冒泡排序?
顾名思义,就如水吐泡泡一样,0到n-1范围上相邻位置较大的数滚下去,最大值冒到n-1位置上,然后在0到n-2范围上继续
过程推理:针对此题来说,一共五个数,一共进行四轮比较。第一轮,第一个数与第二个数比较,大的放在后面,改变位置后第二个数再与第三个数进行比较,大的放在后面,这样最大的便来到了数组最后一个位置;然后第二轮也是从第一个数开始,把第二大的数冒到倒数第二个位置……以此类推
int main()
{
int i,j;
int temp;
int n;
scanf("%d",&n);
int arr[10];
for(i=0;i<n;i++)
scanf("%d",&arr[i]);
for(i=0;i<n-1;i++)
{
for(j=0;j<n-i-1;j++)
{
if(arr[j]>arr[j+1])
{
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
for(i=0;i<n;i++)
printf("%d ",arr[i]);
return 0;
}
3.插入排序
何为插入排序?
0到i范围上已经有序,新来的数从右到左滑到不再小的位置插入,然后继续
过程推理:在本题中,一共有五个数,只需要四轮即可:第一轮,比较第一个和第二个数,使其从小到大有序;第二轮,要使第一、二、三个数有序,即先比较第二个和第三个数,使其有序,再比较第一个和第二个数,使其有序……以此类推
int main()
{
int i,j;
int n;
int temp;
scanf("%d",&n);
int arr[10];
for(i=0;i<n;i++)
scanf("%d",&arr[i]);
for(i=0;i<n-1;i++)
{
for(j=i;j>=0;j--)
{
if(arr[j]>arr[j+1])
{
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
for(i=0;i<n;i++)
printf("%d ",arr[i]);
return 0;
}