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

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

基本思想:

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

例子:

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

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

冒泡排序的代码:

 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. 使用express+mongoDB搭建多人博客 学习(3)connect-flash和mongodb,表单注册

    1.根目录下新建settings.js,存放数据库配置 module.exports={ cookieSecret:"myblog", db:"blog", h ...

  2. Bridges Gym - 100712H  无向图的边双连通分量,Tarjan缩点

    http://codeforces.com/gym/100712/attachments 题意是给定一个无向图,要求添加一条边,使得最后剩下的桥的数量最小. 注意到在环中加边是无意义的. 那么先把环都 ...

  3. 蜥蜴-DInic

    题目背景 07四川省选 题目描述 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴 ...

  4. winform 更新服务器程序

    感谢csdn jekytan 的共享 http://download.csdn.net/detail/jekytan/4242666 本地xml文件 <?xml version="1. ...

  5. ES-windos环境搭建(2)

    下载 打开elasticsearch官网.选择downloads. 选择elasticsearch,并单击Download. 这里我们不选择最新版,而是选择靠前的版本,下拉选择past release ...

  6. plpgsql 数组、JSON相关

    Function Return Type Description Example Result array_append(anyarray,anyelement) anyarray append an ...

  7. codewars遇到的比较有意思的题目

    题目要求是编写一个函数用来检测一个字符串,字符串是一系列单词组成,每个单词间用空格隔开,不用考虑空字符串的情况,返回长度最小的那个单词的长度. 博主刚入门PHP,技术还很菜,没有想出来,看了其他人的解 ...

  8. C/C++ 内存分配方式,堆区,栈区,new/delete/malloc/free

    内存分配方式 内存分配方式有三种: [1] 从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量, static 变量. [2] 在栈上创建.在执行函 ...

  9. Eclipse下对MAVEN进行junit软件测试

    一.Maven project management and build automation tool, more and more developers use it to manage the ...

  10. tomcat配置 —— 各个目录的作用

    tomcat各目录(文件)作用 tomcat-7.0.50解压版,主目录一览: 我们可以看到主目录下有bin,conf,lib,logs,temp,webapps,work 7个文件夹,下面对他们分别 ...