C++基础 (第五章:排序)

排序

什么叫排序?将一系列无序的元素转换成有序的状态,就是排序。例如,我们可以将2 3 1进行从小到大排序,排序后的结果为1 2 3

我们可以按照如下的方法对三个数a b c从小到大排序:

  • 如果c < b成立,则交换cb
  • 如果b < a成立,则交换ba
  • 如果c < b成立,则交换cb

经过如上的三次交换,可以确保a b c三个数一定会按照从小到大的顺序排列了。

对于有限个元素的数组,我们可以尝试交换其中若干对元素,使得整个数组中的元素按从大到小的顺序排列。

但是,当数组中元素个数很多时,这样的排序操作就很不现实了。

在 C++ 中,有一个现成的工具——sort,它可以帮助我们很容易地对数组完成排序操作。

sort排序

sort是一个 C++ 已经为我们实现好的工具,当我们要用它时,需要先引入一个算法的库include<algorithm>

我们可以使用sort对前面学过的各种类型的数组进行从小到大排序,包括intdoublelong longchar甚至string类型的数组,都可以用sort完成排序操作。

当我们使用sortstring类型的数组进行排序时,会将字符串数组中的值按照字典序从小到大排序。

基本用法: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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值