冒泡排序

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

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. iview form表单数值类型校验「iview自定义form表单校验器」

    摘录iview表单验证 Form 组件基于 sync-validator 实现的数据验证,给 Form 设置属性 rules,同时给需要验证的 FormItem 设置属性 prop 指向对应字段即可. ...

  2. UFUN函数 UF_UI UF_PART函数(UF_UI_select_with_class_dialog, UF_PART_export_with_options)

    /*主要演示 UF_PART_export_with_options 这个函数 */1 //设置class_dialog选择过滤 static int init_proc(UF_UI_selectio ...

  3. SWA2G422&485JK2G基础篇: 硬件使用说明

    开发板板载介绍(当前使用的测试板,以后期最终版为准) 一,实物图 硬件说明 一,开发板主控芯片说明: 1. 单片机: STM32F103RET6 2. GPRS模块: Air202 二,开发板外设说明 ...

  4. kubernetes node节点失效 调度

    kubernetes 配置: 测试node挂 机,发布需要等几分才会 在其它 的node机器 启动,这个明显不合理,对于大多数业务 kube-controller-manager配置: /etc/sy ...

  5. linux lnmp环境下 安装apache教程

    linux lnmp环境下 安装apache教程 源码安装 apr ,apr-util 安装apache要用<pre>wget http://mirrors.cnnic.cn/apache ...

  6. StringTable

    首先看这样一个面试题 // StringTable [ "a", "b" ,"ab" ] hashtable 结构,不能扩容 public ...

  7. 【转帖】netstat命令总结

    netstat命令总结 https://www.cnblogs.com/chenqionghe/p/10654109.html nestat介绍 netstat是一款命令行工具,可用于列出系统上所有的 ...

  8. Sitecore 8.2 工作流程

    假设您的新Sitecore项目的所有开发都已完成.现在的下一步是在网站上填写内容并准备上线.客户通知您他们希望使用专门的网站管理员团队负责整个内容管理流程,并要求您为他们准备实例以便能够执行此操作. ...

  9. 【数据结构与算法】线性表操作(C语言)

    #include <stdio.h> #include <stdlib.h> #define OK 1 #define NO 0 #define MAXSIZE 20 type ...

  10. 拦截器配置类使用继承写法导致jackson的全局配置失效

    问题描述 项目中需要一个拦截器用于拦截请求,在没有请求中生成requestId.然后写了一个配置类,这个类继承了 WebMvcConfigurationSupport类,重写了addIntercept ...