冒泡排序应该是最常用的排序方法,我接触的第一个排序算法就是冒泡,老师也经常那这个做例子。

冒泡排序是一种交换排序,

基本思想:

通过两两比较相邻的记录,若反序则交换,知道没有反序的记录为止。

例子:

依次类推。这里可以看出,每次比较从最后一个开始,向前比较,若反序则交换;

每次都保证了是两两相邻的记录比较。

冒泡排序的代码:

 void bubble_sort (myDataType *ary,int len)
{
int i,j;
for (i=;i<len;i++)
{
for (j=len-;j>=i;j--)
{
if (ary[j] > ary[j+])
{
myDataType temp = ary[j];
ary[j] = ary[j+];
ary[j+] = temp;
}
}
} }

完整代码:

 // sort-bubble.cpp : 定义控制台应用程序的入口点。
//
-
#include "stdafx.h" typedef int myDataType;
myDataType src_ary[] = {,,,,,,,,,}; void prt_ary(myDataType *ary,int len)
{
int i=;
while(i < len)
{
printf(" %d ",ary[i++]);
}
printf("\n");
} void bubble_sort (myDataType *ary,int len)
{
int i,j;
for (i=;i<len;i++)
{
for (j=len-;j>=i;j--)
{
if (ary[j] > ary[j+])
{
myDataType temp = ary[j];
ary[j] = ary[j+];
ary[j+] = temp;
}
}
} } int _tmain(int argc, _TCHAR* argv[])
{
printf("before sort:\n");
prt_ary(src_ary,); bubble_sort(src_ary,); printf("after sort:\n");
prt_ary(src_ary,); getchar();
return ;
}

结果:

附录:

另外冒泡排序还有其他变形,

比如:

可以设置一个哨兵下标,对该下标元素和之后的每一个元素做比较,选取最小的元素交换,这样一次类推,每次都是一个最小的元素。

如图:

代码:

 void bubble_sort_modify1(myDataType *ary,int len)
{
int i,j;
for (i=;i<len;i++) // 哨兵下标
{
for (j=i+;j<len;j++) //欲比较的下标
{
if (ary[i] > ary[j])
{
myDataType temp;
temp = ary[i];
ary[i] = ary[j];
ary[j] = temp;
}
}
}
}

这个不是我们标准的冒泡排序算法,但是却很好理解,用的也多。

该算法还可以改进,每次交换顺序耗费时间,可以在比较过程中,将最小值的小标记下,循环结束后,交换。这样每次循环交换操作只有一次。

对标准冒泡排序还可以优化:

10个数字需要循环10趟,如果在第3趟就将所有的顺序排序好了,这样后面的7趟还是要继续执行,但是不起作用。所以可以在比较中添加一个标记

用来查看一次循环是否做了调整,如果没有,则说明排序好了,不用在执行剩余的循环了。

 void bubble_sort_opt (myDataType *ary,int len)
{
int i,j;
bool flag = true; //增加一个标记元素
for (i=;i<len && flag;i++) //判断之前循环是否执行了交换操作
{
flag = false;
for (j=len-;j>=i;j--)
{
if (ary[j] > ary[j+])
{
myDataType temp = ary[j];
ary[j] = ary[j+];
ary[j+] = temp;
flag = true; //查看该循环是否执行了操作
}
}
} }

算法学习记录-排序——冒泡排序(Bubble Sort)的更多相关文章

  1. 算法之经典排序-冒泡排序(bubble sort)

    冒泡排序 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成. 这个算法的名字由来是因为越大的元 ...

  2. 【算法学习记录-排序题】【PAT A1012】The Best Rank

    To evaluate the performance of our first year CS majored students, we consider their grades of three ...

  3. 算法学习记录-排序——插入排序(Insertion Sort)

    插入排序: 在<算法导论>中是这样描述的 这是一个对少量元素进行排序的有效算法.插入排序的工作机理与打牌时候,整理手中的牌做法差不多. 在开始摸牌时,我们的左手是空的,牌面朝下放在桌子上. ...

  4. 算法学习记录-排序——选择排序(Simple Selection Sort)

    之前在冒泡排序的附录中提到可以在每次循环时候,不用交换操作,而只需要记录最小值下标,每次循环后交换哨兵与最小值下标的书, 这样可以减少交换操作的时间. 这种方法针对冒泡排序中需要频繁交换数组数字而改进 ...

  5. 【算法学习记录-排序题】【PAT A1016】Phone Bills

    A long-distance telephone company charges its customers by the following rules: Making a long-distan ...

  6. 【算法学习记录-排序题】【PAT A1025】PAT Ranking

    Programming Ability Test (PAT) is organized by the College of Computer Science and Technology of Zhe ...

  7. 【算法学习记录-排序题】【PAT A1062】Talent and Virtue

    About 900 years ago, a Chinese philosopher Sima Guang wrote a history book in which he talked about ...

  8. java排序算法之冒泡排序(Bubble Sort)

    java排序算法之冒泡排序(Bubble Sort) 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2个数 ...

  9. 排序算法--冒泡排序(Bubble Sort)_C#程序实现

    排序算法--冒泡排序(Bubble Sort)_C#程序实现 排序(Sort)是计算机程序设计中的一种重要操作,也是日常生活中经常遇到的问题.例如,字典中的单词是以字母的顺序排列,否则,使用起来非常困 ...

随机推荐

  1. 如何正确在IDEA 里非maven或非SBT构建的项目中引入lib的jar包(图文详解)

    以下是我,手动的一个项目 假设,大家,还需要导入 导入spark的jar包:是安装主目录下的jars所有jar包和examples/jars包.

  2. Java Lambda表达式 Stream

    Stream Stream不是集合元素,它不是数据结构并不保存数据,而是有关算法和计算的,更像是一个高级版本的Iterator,原始版本的Iterator,用户只能显式地一个一个遍历元素并对其进行操作 ...

  3. Java常用函数式接口--Consumer接口使用案例

    第一种方式: 第二种方式:

  4. vue从入门到开发--1-安装脚手架

    一: 1.在文件目录下打开命令窗口(按住shift+右键[在此处打开命令窗口]或者直接ctrl+R打开命令窗口,利用cd选择到自己的文件目录) 2.$ npm install --global vue ...

  5. LINUX一网卡多IP设置

    方法1:少量IP手动绑定(这里以绑定IP到eth0为例,其它网卡的话修改相应的文件名即可) 1.复制ifcfg-eth0的网卡配置文件并改名为ifcfg-eth0:0 [root@akinlau /] ...

  6. java实现打开Windows控制台窗口

    在写Python程序的时候突发奇想了一下,能不能用java代码实现打开控制台窗口呢? 经过查询网络资料和java API文档,终于实现了: package com.primeton.cmd; impo ...

  7. iOS Category实现原理 (补充)

    iOS Category实现原理 (补充) load 和 initialize load load方法会在程序启动就会调用,当装载类信息的时候就会调用. 调用顺序看一下源代码.在 objc-loadm ...

  8. java文件读写链接流向

    1)字节流 读写的链接流向源节点->FileInputStream->BufferedInputStream->ObjectInputStream->程序 程序->Obj ...

  9. codevs 1497 取余运算

    时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题目描述 Description 输入b,p,k的值,编程计算bp mod k的值.其中的b,p,k*k为长 ...

  10. ios项目icon和default图片命名规则

    一.应用图片标准iOS控件里的图片资源,苹果已经做了相应的升级,我们需要操心的是应用自己的图片资源.就像当初为了支持iPhone 4而制作的@2x高分辨率版本(译者:以下简称高分)图片一样,我们要为i ...