c++排序: 冒泡、选择、插入、归并、快速、堆排序、桶排序

本文详细介绍了C++中的七种排序算法:冒泡排序、选择排序、插入排序、归并排序、快速排序、堆排序和桶排序。归并排序和快速排序的时间复杂度分析,以及堆排序的不稳定性和额外空间复杂度讨论。此外,还提及了桶排序在计算数组排序后相邻两数最大差值的应用。
摘要由CSDN通过智能技术生成

排序

github源码地址


最优解:先满足时间复杂度最优,再满足最小空间

稳定性:相同元素在排序时的先后位置不变

递归:在调用子过程的时候,会把父过程放入中,当子过程结束会回到父的栈中找到中断行号,接着运行。

排序 时间复杂度 额外空间复杂度 稳定性 最好情况 最坏情况
冒泡排序 N^2 1 可以稳定
选择排序 N^2 1 不稳定
插入排序 N^2 1 可以稳定 N(已排序) N^2(逆序)
归并排序 NlogN N 可以稳定
快速排序 NlogN logN 不稳定 每次划分值刚好在中间区域 阈值左右两侧不平均
堆排序 NlogN 1 不稳定
桶排序 N N 稳定

一、冒泡排序

从小到大排序:从第一个数开始,两两比较,大的数往后放。

范围从0N-1…0N-2…0N-3…01,0

稳定性:可以稳定,相等的时候让后面的数做交换即可

void bubble_sort(vector<int> &a) {
   
	if (a.size() < 2) return;
	//每次找到的最小的元素被放到末尾
	for (int end = a.size() - 1; end > 0; --end)
	{
   
		for (int i = 0; i < end; i++)
		{
   
			if (a[i] < a[i + 1]) swap(a[i], a[i + 1]);
		}
	}
}

二、选择排序

找到最小值的下标,和最后的元素交换

稳定性:不稳定,因为需要最小值需要交换

void select_sort(vector<int> &a) {
   
	if (a.size() < 2)return;
	for (int end = a.size()-1; end > 0; --end)
	{
   
		int min = end;
		for (int j = 0; j < end; j++)
		{
   
			if (a[j] < a[min]) min = j;
		}
		swap(a[min], a[end]);
	}
}

三、插入排序

扑克牌插牌:新进来的牌和之前的元素依次比较确定插入的位置

稳定性:可以稳定,插入的时候只需放在相同的后面即可

void insert_sort(vector<int> &a) {
   
	if (a.size() < 2)return;
	for (int i = 1; i < a.size(); i++)
	{
   
		for (int j = i-1; j >=0; j--)
		{
   
			if (a[j] < a[j + 1])swap(a[j], a[j + 1]);
			else break;
		}
	}
}

更优质的写法:

void insert_sort(vector<int> &a) {
   
	if (a.size() < 2)return;
	for (int i = 1; i < a.size(); i++)
	{
   
		for (int j = i-1; j >=0 && a[j]<a[j+1]; j--)
		{
   
			swap(a[j], a[j + 1]);
		}
	}
}

四、归并排序:左排右排合并

递归,函数在调用的时候先分别排序自己的左右,然后再把左右合并起来

额外空间复杂度:O(N),需要额外的数组进行拷贝

稳定性:在merge的过程,只要小于等于就拷贝左边部分

void merge(vector<int> &a, int left,int mid, int right) {
   
	if (left >= right || a.size() < 2) return;
	vector<int> temp;
	int l = left;
	int r = mid + 1;
	while (l<=mid && r <= right)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值