【算法】排序算法(四)——交换排序

本文详细介绍了交换排序的两种主要算法——冒泡排序和快速排序。对冒泡排序的基本思想、优化策略和时间复杂度进行了阐述,并展示了优化版本的冒泡排序代码。对于快速排序,文章不仅讲解了其基本思想,还探讨了三种不同的实现方法,包括挖坑法、左右指针法和前后指针法,并分析了快速排序的时间复杂度和空间复杂度。此外,还讨论了快速排序的优化技巧,如非递归实现和元素数量较少时改用插入排序等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本篇博文旨在介绍排序算法中的交换排序;介绍了冒泡排序和快速排序的基本思想;介绍了冒泡排序和快速排序的几种实现方法;从时间复杂度和空间复杂度进行了分析;并用C++实现了冒泡排序和快速排序


冒泡排序

基本思想

依次比较相邻的两个数,如果前者比后者大,就进行交换。一轮下来可以将大的元素先放到最右边的位置。然后缩小区间,再次从头开始第二轮的冒泡排序,这一次将次大的数放到相应位置。再次从头冒泡,直到区间只有1个数。


算法步骤

按照升序举例

1、比较相邻两个数的大小,如果前面的数比后面的大,就进行交换

2、如果没有比较的区间的尾部,依次向后冒泡

3、这一轮会将最大的数冒到区间的最右边,然后区间右边减少一个数,重复上述步骤

4、直到区间缩小为1

优化思想

当排序到一定趟数时,其剩下的元素可能已经有序,不需要进行冒泡了

这时,再次冒泡只会白白的浪费时间

解决方法只需要加一个标志位,用来判断该次排序有没有进行交换数据。

如果一趟排序下来并没有进行数据的交换,就表示剩下的元素已经有序了,直接结束排序

时间复杂度和空间复杂度

从算法中,我们可以分析出,冒泡排序第一趟排序排N-1次,第二趟排N-2,第三趟N-3....

所以其时间复杂度为O(N* N)

优化后,虽然一定程度上减少了数据的比较次数,在最好情况(有序)下,时间复杂度是O(N)

但是在最坏情况(逆序)下,仍是O(N* N)的算法

所以优化并不能减少冒泡排序的数量级

代码实现——优化版本的冒泡排序

#pragma once 

#include<iostream>
using namespace std;

void Print(int* arr, size_t n)
{
	for (size_t i = 0; i < n; ++i)
	{
		cout << arr[i] << " ";
	}
	cout << endl;
}

//升序
template<typename T>
struct Greater
{
	bool operator()(T& t1, T& t2)
	{
		return t1 &
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值