排序算法的c++实现——冒泡排序
冒泡排序
冒泡排序是我们大多数人接触到的第一种排序算法,原理简单易懂,不多解释。说明三点:
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;
}
排序算法的c++实现——冒泡排序的更多相关文章
- Python之排序算法:快速排序与冒泡排序
Python之排序算法:快速排序与冒泡排序 转载请注明源地址:http://www.cnblogs.com/funnyzpc/p/7828610.html 入坑(简称IT)这一行也有些年头了,但自老师 ...
- 排序算法总结第二弹----冒泡排序---javascript描述
上篇博文总结了选择排序,这篇来看冒泡排序,接上篇. 冒泡排序思想:若是正再将一组数据升序排序, 第一趟:比较相邻的数据,当左侧值大于右侧值将他们进行交换,将较小值向前浮动,大值向后冒泡,直至比较到最后 ...
- 三种排序算法python源码——冒泡排序、插入排序、选择排序
最近在学习python,用python实现几个简单的排序算法,一方面巩固一下数据结构的知识,另一方面加深一下python的简单语法. 冒泡排序算法的思路是对任意两个相邻的数据进行比较,每次将最小和最大 ...
- 排序算法c语言描述---冒泡排序
排序算法系列学习,主要描述冒泡排序,选择排序,直接插入排序,希尔排序,堆排序,归并排序,快速排序等排序进行分析. 文章规划: 一.通过自己对排序算法本身的理解,对每个方法写个小测试程序. 具体思路分析 ...
- 使用Erlang实现简单的排序算法:快速排序,冒泡排序,插入排序
[排序算法] -module(sort). -compile(export_all). %%快速排序 qsort([]) -> []; qsort([Pivot|T]) -> qsort( ...
- 三、排序算法总结一(冒泡排序,插入排序,选择排序)(C++版本)
一.引言 对于各种排序算法也算是有了一定的了解,所以这里做一个总结. 二.冒泡排序法. 这是比较经典的排序算法,主要是通过内外两层的循环比较,使得乱序变为顺序. 下面是一个测试代码 #include ...
- 排序算法Java实现(冒泡排序)
算法描述:对于给定的n个记录,从第一个记录开始依次对相邻的两个记录进行比较,当前面的记录大于后面的记录时,交换位置,进行一轮比较和交换后,n个记录中的最大记录将位于第n位:然后对前(n-1)个记录进行 ...
- JAVA排序算法(一)冒泡排序、选择排序
/* 冒泡排序 * * 相邻的元素,两两比较.如果第一个比第二个大,就交换他们两个. 大的后移 * 对每一对相邻元素做同样的工作,这样第一轮结束后,最大值在最后一个. */ public static ...
- Java排序算法(一)冒泡排序
一.测试类SortTest import java.util.Arrays; public class SortTest { private static final int L = 20; pub ...
随机推荐
- eclipse scala语法用java检验 报错问题
传送门 https://stackoverflow.com/questions/8522149/eclipse-not-recognizing-scala-code 还是 直接用eclipse的 sc ...
- git crate&query&delete tag(九)
root@vmuer-VirtualBox:/opt/myProject# git log --pretty=oneline0169b7a1c4bccb47e76711f353fd8d3864bde9 ...
- Jupyter-notebook安装问题及解决
两种方式: 1.pip install jupyter notebook 2.安装Anaconda 1.pip安装 通过命令行pip,要注意是在哪个虚拟环境,安装好后jupyter notebook所 ...
- Sublime Text3 设置
主题:Spacegrey.sublime-theme 配色方案:Mariana 自动保存 参考:https://www.cnblogs.com/mzzz/p/6178341.html "sa ...
- vb.net 获取文件的版本号
dim strVersion = Reflection.Assembly.LoadFrom(strFileName).GetName().Version.ToString()
- springboot自定义页面拦截
项目结构图 页面拦截代码 @Configuration public class WebConfig implements WebMvcConfigurer { @Override public vo ...
- vux scroller在iOS13上,一停止滑动就跳到顶部
转载:https://blog.csdn.net/sllailcp/article/details/102502452 今天客户反馈的问题,说在最新版的iOS上(iOS13),滑动列表,滑完就会跳到顶 ...
- Flume的Source、Sink总结,及常用使用场景
数据源Source RPC异构流数据交换 Avro Source Thrift Source 文件或目录变化监听 Exec Source Spooling Directory Source Taild ...
- Linux学习笔记之秋水BBR一键部署
0x00 本脚本适用环境 系统支持:CentOS 6+,Debian 7+,Ubuntu 12+内存要求:≥128M 阅读文章时请除手动删出干扰字符“1”.(Shadowsocks) 0x01 关于本 ...
- 【已解決】谷歌浏览器如何清理缓存(cookie)
清除缓存快捷键 Ctrl+Shift+Delete