C++基础算法④——排序算法(插入、桶附完整代码)

文章介绍了两种排序算法,插入排序通过逐步将无序元素插入到有序部分来完成排序,保持稳定性,适合小规模或基本有序的数据;桶排序则将数据分配到不同的桶中再分别排序,适用于数据量一般且分布均匀的场景。
摘要由CSDN通过智能技术生成

排序算法

1.插入排序

2.桶排序


1.插入排序

基本思想:将初始数据分为有序部分和无序部分;每一步将无序部分的第一个值插入到前面已经排好序的有序部分中,直到插完所有元素为止。
步骤如下

  1. 每次从无序部分中取出第一个值,然后,与有序部分中的值从后向前依次比较;
  2. 有序部分比较:当前大于后就交换值;
  3. 重复①②步骤;直到不再交换,就结束循环!
  4. 最后输出循环结果。

假如有[5,2,3,9,4,7] 6个元素值,有序部分为[2,3,5,9],无序部分为[4,7];接下来要把无序部分的“4”元素插入到有序部分,来展示一下插入排序的运行过程。

在这里插入图片描述

  1. 其中,浅绿色代表有序部分,黄色代表无序部分。
  2. 在无序部分中挑出要插入到有序部分中的元素。

在这里插入图片描述

  1. 将插入的元素与左边最近的有序部分的元素进行比较。由于4 < 9,所以9向后移,4向前移。
    •  在这里插入图片描述
  2.  继续与左边最近的有序部分的元素进行比较。由于4 < 5,所以5向后移,4继续向前移。
    1. 在这里插入图片描述
  3. 继续将4与3比较。由于4 > 3,所以不再向前比较,插入到当前位置。此时有序部分,由[2,3,5,9] 变成 [2,3,4,5,9]。
    1. 在这里插入图片描述
//3.插入排序 
#include<iostream>
using namespace std;
int a[1000],n;
int main(){
	cin>>n;
	for(int i=0;i<n;i++){ //1.输入值到数组 
		cin>>a[i];
	}
	for(int i=1;i<n;i++){
		for(int j=i-1;j>=0;j--){
			if(a[j+1]<a[j]){ // 后一个数小于前一个数 
				swap(a[j+1],a[j]); // 交换 
			}
			else{ //因都是有序的,都满足后数>前数,那循环结束了。 
				break;
			} 
		}
	}
	for(int i=0;i<n;i++){
		cout<<a[i]<<" ";
	} 
}

  1. 稳定性:在使用插入排序时,元素从无序部分移动到有序部分时,必须是不相等(大于或小于)时才会移动,相等时不处理,所以直接插入排序是稳定的。

  2. 时间复杂度:选择排序的时间复杂度为O(n^{2})。

  3. 适用场景:待排序序列的元素个数不多(<=50),且元素基本有序。


2.桶排序

基本思想:将待排序的数值k,装入第k个桶,桶号就是待排序的数值,顺序输出各桶的值,得到有序的序列。

例如有 [5,4,9,4],把数值依次装入桶a; 那可以看出 a[4] = 2,a[5] = 1,a[9] = 1

那输出时候,按照顺序输出有桶号 4 4 5 9;
步骤:

  1. 先创建b桶数组并初始化值为0。
  2. 把k值装入第k个桶 b[k]++,对输入的同一个桶号,就累加。
  3. k是输入的桶号,也可以用a[i]表示,b[a[i]]++ 。
  4. 当有桶号数量 b[i]!=0 ,代表第i个桶是有值的,就输出桶号;
  5. 输出后就少了一个值要减掉,即 b[i]--。

编程对1万以内的数进行排序:

#include<iostream>
using namespace std;
int a[100000],b[100000],n;
int main(){
	cin>>n; 
	for(int i=1; i<=n; i++){
		cin >> a[i]; //输入桶号
		b[a[i]]++; // 统计桶号数量1 
	}
	for(int i=1; i<=10000; i++){
		while(b[i]!=0){ //当有桶号 
			cout<<i<<" "; //输出桶号值
			b[i]--;  //桶号数量减1
		}
	}
	return 0;
} 

  1. 时间复杂度:选择排序的时间复杂度为O(n)。
  2. 适用场景:桶排序适用于数据量一般的排序场景。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

唐樽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值