排序
什么叫排序?将一系列无序的元素转换成有序的状态,就是排序。例如,我们可以将2 3 1
进行从小到大排序,排序后的结果为1 2 3
。
我们可以按照如下的方法对三个数a b c
从小到大排序:
- 如果
c < b
成立,则交换c
和b
- 如果
b < a
成立,则交换b
和a
- 如果
c < b
成立,则交换c
和b
经过如上的三次交换,可以确保a b c
三个数一定会按照从小到大的顺序排列了。
对于有限个元素的数组,我们可以尝试交换其中若干对元素,使得整个数组中的元素按从大到小的顺序排列。
但是,当数组中元素个数很多时,这样的排序操作就很不现实了。
在 C++ 中,有一个现成的工具——sort
,它可以帮助我们很容易地对数组完成排序操作。
sort排序
sort
是一个 C++ 已经为我们实现好的工具,当我们要用它时,需要先引入一个算法的库include<algorithm>
。
我们可以使用sort
对前面学过的各种类型的数组进行从小到大排序,包括int
、double
、long long
、char
甚至string
类型的数组,都可以用sort
完成排序操作。
当我们使用sort
对string
类型的数组进行排序时,会将字符串数组中的值按照字典序从小到大排序。
基本用法:sort(数组名, 数组名 + 数组大小);
题目描述:
给定n个值,从小到大输出这个n值。
代码如下:
#include<bits/stdc++.h>
using namespace std;
long long n,a[1000001]={};
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);//输入
}
sort(a,a+n);//排序
for(int i=0;i<n;i++){
printf("%d ",a[i]);//输出
}
return 0;
}
从大到小输出
可以这样从后往前输出:
for(int i=n-1;i>=0;i--){
printf("%d ",a[i]);
}
在 C++ 中,sort
默认的排序顺序是从小到大,我们可以通过指定比较器的方式让它改变排序顺序。如果要从大到小排序,可以用如下的方法来实现:
int a[100];
// ...
sort(a, a + n, greater<int>());
其中,greater
后面一对尖括号里要写上数组的元素类型,并在之后写上一对小括号,尖括号和小括号都是不能省略的。
桶排序
工作的原理是将数组分到有限数量的桶子里,再从大到小或从小到大输出。
注意事项:必须知道数的范围,数的个数知不知道都行。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5;
int main(){
int a[N]={},n,b;
cin>>n;
while(n--){
cin>>b;
a[b]=1;//存入桶中
}
for(int i=1000;i>=0;i--){//从大到小输出
if(a[i]==1) cout<<i<<" ";
}
return 0;
}
冒泡排序
冒泡排序重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行,直到没有相邻元素需要交换,也就是说该元素列已经排序完成。
1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2.对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
3.针对所有的元素重复以上的步骤,除了最后一个。
4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,a[10001];
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
for(int j=0;j<n-1;j++){
for(int i=0;i<n-1-j;i++){
if(a[i]<a[i+1]){//比较大小
swap(a[i],a[i+1]);
}
}
}
for(int i=0;i<n;i++){//从小到大输出
cout<<a[i]<<" ";
}
return 0;
}