#P2011. 冒泡排序.填空题

冒泡排序.填空题

题目描述

输入 N 个整数,使用插入排序法从小到大输出。

输入格式

第一行 1 个正整数: N ,范围在 [1,1000]。

第二行 N 个整数,每个整数范围在 [0,1000000]。

输出格式

一行 N 个从小到大的整数。

样例

4
5 3 6 1
1 3 5 6
4
5 5 1 9
1 5 5 9

完成程序

把大的数字冒泡到后端

#include<bits/stdc++.h>
using namespace std;
int n,a[1001];
int main()
{
	int k,tmp;
	cin>>n;
	
	for(int i=1;i<=n;i++) cin>>a[i];
	 
	for(int i=填空(1);填空(2);i--)
	{
		for(int j=填空(3);填空(4);j++)
		{
			if(填空(5))
			{
				tmp=a[j];
				a[j]=a[j+1];
				a[j+1]=tmp;
			}
		}
	}
	
	for(int i=1;i<=n;i++)
		printf("%d ",a[i]);

	return 0;
}

填空(1):{{ input(1) }}

填空(2):{{ input(2) }}

填空(3):{{ input(3) }}

填空(4):{{ input(4) }}

填空(5):{{ input(5) }}

把小的数字冒泡到前端

#include<bits/stdc++.h>
using namespace std;
int n,a[1001];
int main()
{
	int k,tmp;
	cin>>n;
	
	for(int i=1;i<=n;i++) cin>>a[i];
	 
	for(int i=填空(6);填空(7);i++)
	{
		for(int j=填空(8);填空(9);j--)
		{
			if(填空(10))
			{
				tmp=a[j];
				a[j]=a[j-1];
				a[j-1]=tmp;
			}
		}
	}
	
	for(int i=1;i<=n;i++)
		printf("%d ",a[i]);

	return 0;
}

填空(6):{{ input(6) }}

填空(7):{{ input(7) }}

填空(8):{{ input(8) }}

填空(9):{{ input(9) }}

填空(10):{{ input(10) }}

补充说明

  1. 题目说了是冒泡排序,就一定要按照冒泡排序来写。这个算法是约定俗成的,算法的精髓需要体现出来。冒泡排序,分 2 个模式,一个是把大的数字往后冒,另外一个是把小的数字往前冒,都要会。

  2. 很关键的一点,冒泡排序的比较,一定是相邻两项之间的比较,例如 aja_jaj+1a_{j+1} 比,或者是 aj1a_{j-1}aja_j 比。如果程序是 aia_iaja_j 比,iijj 不一定是挨着的,那即便这个程序能完成排序的功能,也不是冒泡排序。与此同时,如果在编程题中看见题目讲述只能前后相邻的两个数字交换,从无序到有序,一共做了多少次,这种题目就是考大家冒泡排序的算法了,指向性很清晰的。

  3. 要看得出 tmp=a[j];a[j]=a[j+1];a[j+1]=a[j] 这 3 句话的意思,这 3 句话是一个组合拳,作为一个整体来理解就很容易读懂,你拆开一句句看,要想半天。

  4. 几个排序方法要对比来看,看它们各自的特点。如果数据在排序之前就大致有序的,那么插入排序就会很快,如果数据已经是完全有序的,那么插入排序就是比较了 n-1 次。但是对于冒泡排序算法,无论数据是否有序,比较的次数都是一样的,只不过不需要执行前后数据交换的那几行代码。