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