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

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

基本思想:

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

例子:

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

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

冒泡排序的代码:

 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. (洛谷 P1429 平面最近点对(加强版) || 洛谷 P1257 || Quoit Design HDU - 1007 ) && Raid POJ - 3714

    这个讲的好: https://phoenixzhao.github.io/%E6%B1%82%E6%9C%80%E8%BF%91%E5%AF%B9%E7%9A%84%E4%B8%89%E7%A7%8D ...

  2. Dubbo端口占用错误信息

    SEVERE: Exception sending context initialized event to listener instance of class com.common.SysCont ...

  3. c指针参数常见错误

    参数的地址是可以修改的,修改后的地址是不可能传回给调用处的指针变量.也就是说,可以修改参数地址所指的单元的值,这是可以传回到调用处的变量里面的. #include <stdio.h> #i ...

  4. #52. 【UR #4】元旦激光炮 (交互式题)

    链接:http://uoj.ac/problem/52 刚刚越过绝境长城,只见天空中出现了炫目的光芒 —— 圣诞老人出现了. 元旦三侠立刻进入战斗.生蛋侠.圆蛋侠和零蛋侠分别有 na,nb,ncna, ...

  5. systemback-----做你折腾的后盾

    http://imcn.me/html/y2015/24421.html ubuntu的系统还原工具,最近在学习grunt,要安装nodejs 等一些依赖,对于有轻微系统洁癖的我来说是个好的解决方案, ...

  6. System.TypeInitializationException: 'The type initializer for 'MySql.Data.MySqlClient.Replication.ReplicationManager' threw an exception.'

    下午在调试的时候报错数据库连接就报错我就很纳闷后面用原来的代码写发现还是报错 System.TypeInitializationException: 'The type initializer for ...

  7. Android 开机启动服务

    在xml中注册 <!-- 开机广播 --> <receiver android:name=".receiver.BootBroadcastReceiver"> ...

  8. 10个优秀的移动Web应用开发框架

    在最近几年里,移动互联网高速发展.市场潜力巨大.继计算机.互联网之后,移动互联网正掀起第三次信息技术革命的浪潮,新技术.新应用不断涌现.今天这篇文章向大家推荐10大优秀的移动Web开发框架,帮助开发者 ...

  9. scrollviews page分页实现方式

    代码 buttonX = 0; buttonW = 50; buttonH = 20; margin = (self.view.width - 5 * buttonW) / 6; CGFloat ym ...

  10. python 基础网络编程1

    python 基础网络编程1 Source code: Lib/socketserver.py lib的主目录下有一个sockserver.py文件, 里面是python基本的网络编程模型 共有一个b ...