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

排序算法

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})。

    扫描二维码关注公众号,回复: 17115007 查看本文章
  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. 适用场景:桶排序适用于数据量一般的排序场景。

猜你喜欢

转载自blog.csdn.net/weixin_44775255/article/details/129693678
今日推荐