一、冒泡排序

冒泡排序就是重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如数字从大到小、首字母从A到Z)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素已经排序完成。

这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。

冒泡排序算法的原理如下:

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

二、排序过程

如需要排序的元素为 88,1,59,105,9,2,8,15,6,10 ,将需要排序的元素按照从小到大依次排序,接下来一步一步分析使用冒泡排序对这些元素进行排序的过程。

  1. 排序前: 88 1 59 105 9 2 8 15 6 10
  2. 经过第一轮排序 1 59 88 9 2 8 15 6 10 105
  3. 经过第二轮排序 1 59 9 2 8 15 6 10 88 105
  4. 经过第三轮排序 1 9 2 8 15 6 10 59 88 105
  5. 经过第四轮排序 1 2 8 9 6 10 15 59 88 105
  6. 经过第五轮排序 1 2 8 6 9 10 15 59 88 105
  7. 经过第六轮排序 1 2 8 6 9 10 15 59 88 105

以上就是冒泡排序的整个排序过程,经过六轮排序之后所有排序已经完成。

三、程序实现

1、不设置元素位置交换标志位。
#include<iostream>
using namespace std; const int BUFFSIZE = 10;
int Bubble_Sort(int Arr[]);
int main()
{
int Arr[BUFFSIZE] = { 88,1,59,105,9,2,8,15,6,10 }; // 待排序元素
Bubble_Sort(Arr) //排序
return 0;
} int Bubble_Sort(int Arr[])
{
int Counts = BUFFSIZE - 1; // 排序总轮数
for (int i = 0; i < Counts; i++)
{
for (int j = 0; j < Counts - i; j++)
{
if (Arr[j] > Arr[j + 1])
{
int tmp = Arr[j + 1];
Arr[j + 1] = Arr[j];
Arr[j] = tmp;
}
}
//每一轮排序后输出元素顺序
for (int i = 0; i < BUFFSIZE; i++)
{
cout << Arr[i] << " ";
}
cout << endl;
} return 0;
}

程序输出:

1 59 88 9 2 8 15 6 10 105
1 59 9 2 8 15 6 10 88 105
1 9 2 8 15 6 10 59 88 105
1 2 8 9 6 10 15 59 88 105
1 2 8 6 9 10 15 59 88 105
1 2 6 8 9 10 15 59 88 105 // 在第六次的时候已经排序完成
1 2 6 8 9 10 15 59 88 105
1 2 6 8 9 10 15 59 88 105
1 2 6 8 9 10 15 59 88 105

由程序输出可以看出,在第六次的时候已经排序完成,后面几次都没有元素交换,也就是说后面几次其实是无意义的。这样我们可以改进一下排序算法,设置一个元素位置交换标志位记录本次排序是否有元素位置发生变化,如果没有则认为排序已经完成,程序不需要再继续执行,改进后的程序如下。

2、改进排序算法,设置元素位置交换标志位。

#include<iostream>
using namespace std; const int BUFFSIZE = 10;
int Bubble_Sort_r(int Arr[]); int main()
{
int Arr2[BUFFSIZE] = { 88,1,59,105,9,2,8,15,6,10 }; // 待排序元素
Bubble_Sort_r(Arr2); // 排序
return 0;
} int Bubble_Sort_r( int Arr[])
{
bool SwapFlag = true; // 标志位,记录每次排序是否有元素位置交换
int Counts = BUFFSIZE - 1;
for (int i = 0; i < Counts&&SwapFlag!=false; i++) // 如果上次排序元素位置未改变,则排序完成。
{
SwapFlag = false; // 每次排序前,标志位复位
for (int j = 0; j < Counts - i; j++)
{
if (Arr[j] > Arr[j + 1])
{
SwapFlag = true; //发生位置交换,标志位置位
int tmp = Arr[j + 1];
Arr[j + 1] = Arr[j];
Arr[j] = tmp;
}
}
for (int i = 0; i < BUFFSIZE; i++)
{
cout << Arr[i] << " ";
}
cout << endl;
} return 0;
}

程序输出:

1 59 88 9 2 8 15 6 10 105
1 59 9 2 8 15 6 10 88 105
1 9 2 8 15 6 10 59 88 105
1 2 8 9 6 10 15 59 88 105
1 2 8 6 9 10 15 59 88 105
1 2 6 8 9 10 15 59 88 105 // 在第六次的时候已经排序完成
1 2 6 8 9 10 15 59 88 105 // 第七次标志位没有置位,发现排序已经完成

冒泡排序的C、C++实现的更多相关文章

  1. [C#][算法] 用菜鸟的思维学习算法 -- 马桶排序、冒泡排序和快速排序

    用菜鸟的思维学习算法 -- 马桶排序.冒泡排序和快速排序 [博主]反骨仔 [来源]http://www.cnblogs.com/liqingwen/p/4994261.html  目录 马桶排序(令人 ...

  2. 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)

    本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...

  3. Html5 冒泡排序演示

    冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法. 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要 ...

  4. javascript冒泡排序

    数组冒泡排序算法(升序) 升序:小数在前,大数在后 冒泡排序的原则:每次比较相邻两个元素,如果前一个数>后一个数,说明违反升序的要求,就将两数交换位置.否则,保持不变.继续比较下一对. 例如:玩 ...

  5. Java中的经典算法之冒泡排序(Bubble Sort)

    Java中的经典算法之冒泡排序(Bubble Sort) 神话丿小王子的博客主页 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一 ...

  6. C#冒泡排序算法

    用了两种形式的数据,一个是泛型List,一个是数据int[].记录一下,作为自己学习过程中的笔记. using System; using System.Collections.Generic; us ...

  7. python排序之二冒泡排序法

    python排序之二冒泡排序法 如果你理解之前的插入排序法那冒泡排序法就很容易理解,冒泡排序是两个两个以向后位移的方式比较大小在互换的过程好了不多了先上代码吧如下: 首先还是一个无序列表lis,老规矩 ...

  8. 以冒泡排序为例--malloc/free 重定向stdin stdout

    esort.c 代码如下,可关注下mallloc/free,freopen重定向的用法,排序为每轮将最小的数放在最前面: #include<stdio.h> #include<mal ...

  9. 浅谈C++之冒泡排序、希尔排序、快速排序、插入排序、堆排序、基数排序性能对比分析之后续补充说明(有图有真相)

    如果你觉得我的有些话有点唐突,你不理解可以想看看前一篇<C++之冒泡排序.希尔排序.快速排序.插入排序.堆排序.基数排序性能对比分析>. 这几天闲着没事就写了一篇<C++之冒泡排序. ...

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

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

随机推荐

  1. 一兄弟把/etc/init.d/functions误删除了,这是多么悲催的节奏啊;

    RPM resource /lib/lsb/init-functions /lib/lsb/init-functions vs. /etc/init.d/functions in init scrip ...

  2. 非阻塞 sleep

    在OpenResty里面选择使用库的时候,有一个基本的原则:尽量使用ngx Lua的库函数,尽量不用Lua的库函数,因为Lua的库都是同步阻塞的. 再来一个例子来说明阻塞API的调用对nginx并发性 ...

  3. [转]在C++中容易出现的#error No Target Architecture

    项目环境:win 7 64位,编译环境:VS2013 最近在写C++的项目,发现了自己很多不会的地方,这也使得我在C++中的成长变得比较快,下面我就说说我自己在写项目是遇到的一些问题,希望可以帮到一些 ...

  4. 生成定长随机数-可做3des密钥

    3DES加解密需要密钥支持,要求为8的倍数,一般会使用32位的字母数字随机字符串作为密钥. 下面这个工具类,可用做key值的生成,详见下方代码: package test; import java.u ...

  5. 2017-2018-2 20155224『网络对抗技术』Exp5:MSF基础应用

    基础问题回答 用自己的话解释什么是exploit,payload,encode? exploit就相当于是载具,将真正要负责攻击的代码传送到靶机中,我觉得老师上课举的火箭和卫星的例子非常形象,火箭只是 ...

  6. 20155318 《网络攻防》Exp6 信息搜集与漏洞扫描

    20155318 <网络攻防>Exp6 信息搜集与漏洞扫描 基础问题 哪些组织负责DNS,IP的管理. 互联网名称与数字地址分配机构,ICANN机构.其下有三个支持机构,其中地址支持组织( ...

  7. Android开发——异步任务中Activity销毁时的问题

    0.  前言 在Android开发中经常会发生Activity的销毁重建,比如用户长时间接听一个电话后回到APP.在Android开发--Fragment知识整理(二)中我们提到了使用Fragment ...

  8. Hadoop开发第3期---Hadoop的伪分布式安装

    一.准备工作 1. 远程连接工具的安装 PieTTY 是在PuTTY 基础上开发的,改进了Putty 的用户界面,提供了多语种支持.Putty 作为远程连接linux 的工具,支持SSH 和telne ...

  9. 老项目迁移到springboot之后,上线服务器出现404的解决方法

    原因是老项目迁移到springboot之后,已经不再使用web.xml的配置了,但是WEB-INF目录下还有web.xml,所以才导致的404,所以只需要在源码处删除整个WEB-INF重新build即 ...

  10. 用Spring.Services整合 thrift0.9.2生成的wcf中间代码-复杂的架构带来简单的代码和高可维护性

    最近一直在看关于thrift的相关文章,涉及到的内容的基本都是表层的.一旦具体要用到实际的项目中的时候就会遇到各种问题了! 比如说:thrift 的服务器端载体的选择.中间代码的生成options(a ...