算法入门1:选择、冒泡、插入排序

6 阅读2分钟

题目:给定整数序列 [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;
}