内部排序算法之冒泡排序

原创 2013年12月06日 00:08:25

冒泡排序虽然简单,但是之前没有细细体会过程,经常写错循环条件。做个笔记,以防遗忘。

将所有元素的从第一个到最后一个, 相邻的两个元素之间全部两两比较一次,逆序则交换,称为一趟冒泡过程。

首先,明白这样的事实:

1. N个元素, 相邻两个元素之间两两比较只需N-1次就可以选出最大值。

2. N个元素, 第1趟冒泡, 两两比较N-1次,选出了N个元素中最大的元素(正序中最后一个位置)。第2趟冒泡,需要在N-1个元素中两两比较N-2次,选出最大的元素(也就是N个元素中第二大的元素, 正序中倒数第2个位置)。由此推出第k趟需要比较N-1-k次来选择出N-k个元素中最大的元素(也就是N个元素中第k大的元素, 正序中倒数第k个位置)。

冒泡排序的过程就是从一个元素开始,相邻的元素之间两两比较,逆序则交换。每一趟冒泡结束后,最后一个元素就选是当前序列中最大的元素, 最后一个元素不会参与下一次冒泡过程, 这样下一次参加冒泡过程的元素个数每次减少1,直到最后参加冒泡的只有第1个个元素,这样 N个元素就变成了正序。

冒泡排序的特点是:

1.N个元素必定会比较 N*(N+1)/2次。

2.N个元素如果是正序,则比较N*(N+1)/2次, 不用交换。

3. N个元素如果是逆序, 则比较N*(N+1)/2次, 交换N*(N+1)/2次

冒泡排序中,可以设置一个标志, 如果第一趟冒泡过程中, 没有发生交换, 则说明是正序, 省下了后续无用的比较。

明白过程后, 就不会写错循环条件。

常用的冒泡排序代码中, 一般的形式就一下2种:

1.每趟选出最大的

void bubble_sort(int* p, int n)

{

  int i, j;

  for(i=0; i<n-1; ++i)

  {

    for(j=0; j<n-1-i; ++j)

    {

      if(p[j+1] < p[j])

      {

        swap(&p[j+1], &p[j]);

      }

    }

  }

}

2.每趟选出最小的

void bubble_sort(int* p, int n)

{

int i, j;

for(i=0; i<n-1; ++i)

{

  for(j=n-1; j>i; --j)

  {

    if(p[j-1] > p[j])

    {

      swap(&p[j-1], &p[j]);

    }

  }

}

}



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

七大内部排序算法总结(插入排序、希尔排序、冒泡排序、简单选择排序、快速排序、归并排序、堆排序)

转自:http://blog.csdn.net/to_be_it_1/article/details/37866391#comments 写在前面:           ...

内部排序算法(一):交换排序(冒泡排序,快速排序)

这是我的博文系列《内部排序算法》的第一篇。所谓排序,就是要整理文件中的记录,使之按关键字递增(或递减)次序排列起来。所谓内部排序,是指在排序过程中,若整个文件都是放在内存中处理,排序时不涉及数据的内、...

常用内部排序算法之四:简单选择排序、直接插入排序和冒泡排序

前言之所以把这三类算法放在一块,是因为除此之外的算法都是在这三类算法的基础上进行优化的。简单选择排序的思想是每一趟n−i+1(i=1,2,...,n−1)n-i+1(i=1,2,...,n-1)个记录...

七大内部排序算法总结(插入排序、希尔排序、冒泡排序、简单选择排序、快速排序、归并排序、堆排序)

写在前面:                  排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的任意序列,重新排列成一个按关键字有序的序列。因此排序掌握各种排序算法非常重要。...

八大内部排序算法(上)-冒泡、直接插入、简单选择、快速

八大内部排序算法(上)冒泡、直接插入、简单选择、快速 排序分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要...

【数据结构与算法】内部排序之二:冒泡排序和选择排序(改进优化,附完整源码)

之所以把冒泡排序和选择排序放在一起,是因为二者的实现代码很相似,而且都是最基本的排序方式,非常容易理解和实现。当然,如果仅仅是为了讲述这两种排序方式,那也根本没必要写这篇博文了。和上篇博文一样,我会在...

采用回调函数的内部排序算法-插入排序,希尔排序,冒泡,快排,堆排,归并排,基数排序

首先介绍回调函数,然后将回调函数应用于内部排序算法中,最后通过代码实现之,如果有什么问题和发现BUG,相互讨论或者请发E-mail。 1.回调函数(callback function) :简而言之,...
  • weege
  • weege
  • 2011-07-28 22:53
  • 1528

JAVA内部排序算法汇总

  • 2008-04-02 17:46
  • 34KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)