今天开始咱们来看一下洛谷的排序题单,通过排序的题目学习排序的方法和思想,并且为以后能更好的解决问题提供足够强的能力。
那么我们来看根据难度降序排列的题单里面的第一道题目 P1116车厢重组,首先我们来看一下题目👇
题目描述
其实把这道题目翻译出来就是说,有一串数列,一次能够交换相邻两数字的位置,然后问最少交换几次可以使得这串数列变成从小到大的排列顺序。大家在刷题的时候一定要多锻炼这种从实际生活问题中抽象出一个数学问题的能力,要透过现象看到问题的本质。
那么知道了这道题要我们干什么,接下来要做的就只是用计算机能看懂的代码实现出来就OK了。
既然要输入一个正整数N和一串长度为N的数列,那么int型的变量n和int型、长度为n的数组a[n]也就必不可少了,但是大家要注意的是,含有变量的数组表示形式不能用a[n]={0};的格式对它进行初始化,而必须要使用for循环对它里面的每个位置逐步进行初始化,那既然如此,变量i也是不可或缺的。
其次,大家想一下,我们来实现某个数和它后面数字的判断和换位是要循环进行的,那肯定是双重循环(即循环嵌套循环的结构),故此光有i还不行,j也不能少。
我们要输出的答案是最少交换次数,那么,每进行一次交换,我们要有个计数器+1,最后输出这个变量的值就可以了。既然是答案,那我们就将这个计数器定义为ans好了。
思路想通了,那么我们用代码实现就很简单了,AC代码如下👇
C++代码
#include <bits/stdc++.h> //万能头文件
using namespace std;
int main()
{
int n,i,j,ans=0,l=0; //对以上变量进行定义和初始化
cin >> n ;
int a[n];
for(i=0;i<n;i++){
cin >> a[i] ; //直接用循环存入数组
}
for(i=0;i<n-1;i++){
for(j=i+1;j<n;j++){
if(a[i]>a[j]){
swap(a[i],a[j]); //用swap(int x,int y)交换两数的位置
ans++; //每交换一次ans加一
}
}
}
cout << ans ;
return 0;
}
以上就是本xiao cai ji对这道题目的见解,希望可以对大家有所帮助~~