冒泡排序

冒泡排序是我们大多数人接触到的第一种排序算法,原理简单易懂,不多解释。说明三点:

1. 冒泡排序是稳定排序,只有当两个元素不同时才会交换;

2. 冒泡排序是原址排序,不需要借助额外的空间;

3. 冒泡排序通常见到的都是通过循环来实现的,其实通过递归来实现更简洁。

4. 冒泡排序的时间复杂度为O(N*N)

代码如下所示:

 /***********************************************************************
* Copyright (C) 2019 Yinheyi. <chinayinheyi@163.com>
*
* This program is free software; you can redistribute it and/or modify it under the terms
* of the GNU General Public License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version. * Brief:
* Author: yinheyi
* Email: chinayinheyi@163.com
* Version: 1.0
* Created Time: 2019年05月08日 星期三 21时53分25秒
* Modifed Time: 2019年05月08日 星期三 23时48分18秒
* Blog: http://www.cnblogs.com/yinheyi
* Github: https://github.com/yinheyi
*
***********************************************************************/ // 对于冒泡排序,这肯定是大家接触编程时第一个碰到的排序算法。
// 原理很简单: 以从小到大排序为例,假设一个数组的长度为n, 则:
// 第一次: 从数组尾部开始向前, 两两元素之间进行比较, 共比较n-1次,就可以把最小元素移
// 动到数组下标为0的地方, 此时有1个排序完成, 剩余n-1个还没有排序。
// 第二次:还是从数组尾部开始向前,两两元素之间进行比较, 共比较n-2次,就可以把剩余的
// 元素中最小的元素移动到数组下标为1的地方,此时有2个元素排序完成,剩余n-2还没有排序。
// 第三次: 重复以上过程。
//
// 原始 第一次 第二次 第三次 第四次 第五次
// 3 -12 -12 -12 ... ...
// 2 3 1 1
// 8 2 3 1
// 1 8 2 3
// -12 1 8 2
// 32 1 1 8
// 1 32 32 32
//
//
// 说明:1. 冒泡排序是稳定排序,只有当两个元素不同时才会交换;
// 2. 冒泡排序通常见到的都是通过循环来实现的,其实通过递归来实现更简洁。
// 3. 冒泡排序的时间复杂度为O(N*N)
//
//
bool less(int lhs, int rhs);
bool greate(int lhs, int rhs);
static inline void swap(int& lhs, int & rhs);
void PrintArray(int array[], int nLength_);
typedef bool (*Comp)(int, int); // 基于循环来实现的冒泡排序:
void BubbleSort_Loop(int array[], int nLength_, Comp CompFunc)
{
if (array == nullptr || nLength_ <= || CompFunc == nullptr)
return; // 对于n个元素,只需要排前n-1个元素即可, 即下标为0, 1, 2, ..., n-2的元素。
for (int i = ; i < nLength_ - ; ++i)
{
// 如果要使下标为i的元素变成有序的,需要从数组尾部开始两两交换,直至交换到i
for (int j = nLength_ - ; j > i; --j)
{
if (!CompFunc(array[j-], array[j]))
{
swap(array[j-], array[j]);
}
}
}
} // 基于递归来实现冒泡排序:
void BubbleSort_Recursion(int array[], int nLength_, Comp CompFunc)
{
if (array == nullptr || nLength_ <= || CompFunc == nullptr)
return; // 从数组尾部向前,对不符合要求的元素进行两两交换,从而使数组头部的元素为最小或最大
for (int i = nLength_ - ; i > ; --i)
{
if (!CompFunc(array[i-], array[i]))
{
swap(array[i-], array[i]);
}
} // 对数组剩余的元素进行递归操作
BubbleSort_Recursion(array + , nLength_ - , CompFunc);
} // 小小的测试
#include <iostream>
/*************** main.c *********************/
int main(int argc, char* argv[])
{
int test1[] = {-, -, , , -, , , , , };
std::cout << "原顺序为:" << std::endl;
PrintArray(test1, ); std::cout << "基于循环的从小到大排序:" << std::endl;
BubbleSort_Loop(test1, , less);
PrintArray(test1, );
std::cout << "基于循环的从大到小排序:" << std::endl;
BubbleSort_Loop(test1, , greate);
PrintArray(test1, ); std::cout << "基于递归的从小到大排序:" << std::endl;
BubbleSort_Recursion(test1, , less);
PrintArray(test1, );
std::cout << "基于递归的从大到小排序:" << std::endl;
BubbleSort_Recursion(test1, , greate);
PrintArray(test1, ); return ;
} // 小于比较函数
bool less(int lhs, int rhs)
{
return lhs < rhs;
} // 大于比较函数
bool greate(int lhs, int rhs)
{
return lhs > rhs;
} // 交换两个元素的值
static inline void swap(int& lhs, int & rhs)
{
int _nTemp = lhs;
lhs = rhs;
rhs = _nTemp;
} // 打印数组函数
void PrintArray(int array[], int nLength_)
{
if (nullptr == array || nLength_ <= )
return; for (int i = ; i < nLength_; ++i)
{
std::cout << array[i] << " ";
} std::cout << std::endl;
}

最新文章

  1. Sprite(精灵)&amp;&amp; 三个特殊的层Layer
  2. 翻译:AKKA笔记 - 介绍Actors
  3. VC6在win7环境下无法添加以及打开现有文件的解决办法
  4. XML文件与实体类的互相转换
  5. PL/SQL异常
  6. access中根据一个表创建另一个
  7. Javascript基础系列之(五)条件语句(比较操作符)
  8. Http状态码301和302概念简单区别
  9. impdp的一些实际问题解决方法
  10. Android_Dialog
  11. delphi 程序是否为控制台编译选项
  12. Ajax 原生和jQuery的ajax用法
  13. SDN期末作业
  14. vscode开发中绝对让你惊艳的插件!!!(个人在用)
  15. 栈和堆(Stack &amp;&amp; Heap)
  16. oracle 查询表中数据行(row)上最后的DML时间
  17. h5 plus/h5+规范使用,模块索引,教你如何去看h5+的手册
  18. leetcode-6-Z字形变换
  19. QT样式
  20. C语言 结构体相关 函数 指针 数组

热门文章

  1. Hibernate框架学习3
  2. ant design pro如何实现分步表单时,返回上一步值依然被保存
  3. React的使用小规范----长期更新
  4. hasura graphql-engine + plv8 集成
  5. 《Modern PHP》读书笔记
  6. oracle拼接sql语句
  7. Mercari Price Suggestion in Kaggle
  8. cad 一个小技巧--复制视口带冻结信息
  9. Docker从入门到实践(3)
  10. Mysql 8.0版本开始,不允许创建 MyISAM 分区表