三大排序——冒泡排序、选择排序和桶排序( 按从小到大排序)

一:冒泡排序

定义:依次比较相邻两个元素,如果左边的数大于右边的数,那么这两个数交换位置。

过程:

 

 

253461原数
253461第一次比较2和5
235461第二次比较5和3
234561第三次比较5和4
234561第四次比较5和6
234516第五次比较6和1
第一轮结束
准备从头开始第二轮

第一轮 :

第一次比较2和5,2<5,所以不交换位置

第一次比较5和3,5>3,所以交换位置

第一次比较5和4,5>4,所以交换位置

第一次比较5和6,5<6,所以不交换位置

第一次比较6和1,6>1,所以交换位置

234516第二轮开始的数
234516第一次比较2和3
234516第二次比较3和4
234516第三次比较4和5
234156第四次比较5和1
234156第五次比较5和6

第二轮:

第一次比较2和3,2<3,所以不交换位置

第一次比较3和4,3<4,所以不交换位置

第一次比较4和5,4<5,所以不交换位置

第一次比较5和1,5>1,所以交换位置

第一次比较5和6,5<6,所以不交换位置

依次按这个顺序(我太懒了,实在不想写了)比较下去得到的最终数字就是1 2 3 4 5 6

图像解说(来源于百度)

 

那么代码应该怎么敲呢

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n;
	cin>>n;
	int a[100];
	for(int i=1;i<=n;i++)
		cin>>a[i]; 
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n-i;j++)
			if(a[j]>a[j+1])
				swap(a[j],a[j+1]);
	for(int i=1;i<=n;i++)
		cout<<a[i]<<" ";
} 

可以看一下输出结果

 二 选择排序:

定义:第一次从待排序的元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。

我懒得写过程了,直接上百度的图。

 

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n;
	cin>>n;
	int a[n];
	for(int i=1;i<=n;i++)
		cin>>a[i];
	for(int i=1;i<=n-1;i++)	
		for(int j=i+1;j<=n;j++)
			if(a[i]>a[j]) 
				swap(a[i],a[j]);
	for(int i=1;i<=n;i++)
		cout<<a[i]<<" ";
	return 0;
}

 三.桶排序

#include<bits/stdc++.h>//桶排序 
using namespace std;//利用数组下标和数字相同,然后输出数组下标即可。
int a[1000];//写在主函数外,为全局变量,自动默认里面的值全部都为0 。 
 int main(){
	int n;
	cin>>n;
	int x; 
	for(int i=1;i<=n;i++)
	{
		cin>>x;
		a[x]++;//在数组所有元素初值为0的情况下,
			   //我把数字和数组下标一样的数里面的值全部成为1,即不为0 
	} 
	for(int i=0;i<1000;i++)
		if(a[i]!=0)//为0的相当于没有这个数字,
					//把数字排序此时就相当于把元素值为1的数组元素下标排序 
			cout<<i<<" ";
	return 0;
}
//数字超过10000不建议用桶排序 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值