冒泡排序

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

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++实现——冒泡排序的更多相关文章

  1. Python之排序算法:快速排序与冒泡排序

    Python之排序算法:快速排序与冒泡排序 转载请注明源地址:http://www.cnblogs.com/funnyzpc/p/7828610.html 入坑(简称IT)这一行也有些年头了,但自老师 ...

  2. 排序算法总结第二弹----冒泡排序---javascript描述

    上篇博文总结了选择排序,这篇来看冒泡排序,接上篇. 冒泡排序思想:若是正再将一组数据升序排序, 第一趟:比较相邻的数据,当左侧值大于右侧值将他们进行交换,将较小值向前浮动,大值向后冒泡,直至比较到最后 ...

  3. 三种排序算法python源码——冒泡排序、插入排序、选择排序

    最近在学习python,用python实现几个简单的排序算法,一方面巩固一下数据结构的知识,另一方面加深一下python的简单语法. 冒泡排序算法的思路是对任意两个相邻的数据进行比较,每次将最小和最大 ...

  4. 排序算法c语言描述---冒泡排序

    排序算法系列学习,主要描述冒泡排序,选择排序,直接插入排序,希尔排序,堆排序,归并排序,快速排序等排序进行分析. 文章规划: 一.通过自己对排序算法本身的理解,对每个方法写个小测试程序. 具体思路分析 ...

  5. 使用Erlang实现简单的排序算法:快速排序,冒泡排序,插入排序

    [排序算法] -module(sort). -compile(export_all). %%快速排序 qsort([]) -> []; qsort([Pivot|T]) -> qsort( ...

  6. 三、排序算法总结一(冒泡排序,插入排序,选择排序)(C++版本)

    一.引言 对于各种排序算法也算是有了一定的了解,所以这里做一个总结. 二.冒泡排序法. 这是比较经典的排序算法,主要是通过内外两层的循环比较,使得乱序变为顺序. 下面是一个测试代码 #include ...

  7. 排序算法Java实现(冒泡排序)

    算法描述:对于给定的n个记录,从第一个记录开始依次对相邻的两个记录进行比较,当前面的记录大于后面的记录时,交换位置,进行一轮比较和交换后,n个记录中的最大记录将位于第n位:然后对前(n-1)个记录进行 ...

  8. JAVA排序算法(一)冒泡排序、选择排序

    /* 冒泡排序 * * 相邻的元素,两两比较.如果第一个比第二个大,就交换他们两个. 大的后移 * 对每一对相邻元素做同样的工作,这样第一轮结束后,最大值在最后一个. */ public static ...

  9. Java排序算法(一)冒泡排序

    一.测试类SortTest  import java.util.Arrays; public class SortTest { private static final int L = 20; pub ...

随机推荐

  1. 【myBatis】Error evaluating expression ‘’. Return value () was not iterable.

    被遍历的foreach不是数组或者集合

  2. ant design pro 的modal

    通常弹框位置有限,如果一行不下,就拆成两行,例如Table

  3. 出现 sudo: unable to resolve host XXX 信息解决办法

    Ubuntu环境,  每次执行sudo 就出现这个警告讯息:sudo: unable to resolve host XXX虽然sudo 还是可以正常执行,是机器在反解上的问题, 所以就直接从/etc ...

  4. W5500 学习开发: W5500学习说明

    前言 官方已经给了大部分的例子,我只是做一下移植说明 这一节看一下如何移植官网程序的DHCP 首先先明确:单片机和W5500通信是通过SPI,所有的数据都是通过SPI接收和发送, 所以,拿到官方源码只 ...

  5. [PHP] Laravel使用redis保存SESSION

    Laravel使用redis保存SESSION 首先确认服务器已经安装redis服务,php安装了redis扩展. 1.打开config/database.php.在redis配置项中增加sessio ...

  6. 设置 npm 源为淘宝镜像

    淘宝 npm 网址 https://npm.taobao.org/ 修改 npm config set registry http://registry.npm.taobao.org/ 还原 npm ...

  7. Expect Command And How To Automate Shell Scripts Like Magic

    In the previous post, we talked about writing practical shell scripts and we saw how it is easy to w ...

  8. docker-compose可持续集成之jenkins

    1.下载docker-compose curl -L https://get.daocloud.io/docker/compose/releases/download/1.24.1/docker-co ...

  9. FPFA学习笔记的系列

    1.Zynq 学习裸跑系列 学会Zynq(1)搭建Zynq-7000 AP SoC处理器 作者:FPGADesigner 学会Zynq(2)Zynq-7000处理器的配置详解 作者:FPGADesig ...

  10. jdk 1.7新特性

    JDK1.7新特性 1,switch中可以使用字串了String s = "test";   switch (s) {   case "test" :      ...