关闭

内部排序算法之冒泡排序

611人阅读 评论(1) 收藏 举报
分类:

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

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

首先,明白这样的事实:

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]);

    }

  }

}

}



0
0
查看评论

算法代码实现之冒泡排序,Java实现

两种类似的方式: /** * 冒泡排序 * @author roc */ public class BubbleSort { //交换数组元素 private static void swap(int[] a,int i,int j){ int t = a[...
  • QQ245671051
  • QQ245671051
  • 2016-02-27 20:45
  • 849

排序算法之冒泡排序的思想以及Java实现

1 基本思想 设排序表长为n,从后向前或者从前向后两两比较相邻元素的值,如果两者的相对次序不对(A[i-1] > A[i]),则交换它们,其结果是将最小的元素交换到待排序序列的第一个位置,我们称它为一趟冒泡。下一趟冒泡时,前一趟确定的最小元素不再参与比较,待排序序列减少一个元素,每趟冒泡的...
  • whq19890827
  • whq19890827
  • 2016-08-14 21:12
  • 1548

数据结构之排序算法(二)-冒泡排序及改进

冒泡排序算法需要遍历几次数组。每次遍历都要比较连续相邻的元素,如果某一对相邻元素是降序,则互换它们的值,否则,保持不变。由于较小的值像“气泡”一样逐渐浮想顶部,而较大的值沉向底部,所以叫冒泡排序。 冒泡排序的图解是: 总结一句话就是:连续比较相邻的元素,降序则呼唤。有n个数,共需要比较n...
  • tuke_tuke
  • tuke_tuke
  • 2015-12-21 15:10
  • 2144

冒泡排序算法及其优化

冒泡排序 1、介绍: 冒泡排序和选择排序的思想是蛮力法,冒泡,顾名思义,每次选择后面一个元素(最大或者最小)冒上来,从而得到一个有序的序列。比如对于序列:10、8、5、7、3、1的冒泡第一趟演示图示如图所示 可见第一趟过后做大元素10已经沉底,第二趟就对另外的8、5、7、3、1进行上述同样...
  • diaoaa
  • diaoaa
  • 2014-03-29 13:20
  • 3224

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

前言之所以把这三类算法放在一块,是因为除此之外的算法都是在这三类算法的基础上进行优化的。简单选择排序的思想是每一趟n−i+1(i=1,2,...,n−1)n-i+1(i=1,2,...,n-1)个记录中选择最小的记录作为有序序列的第ii个记录。直接插入排序的思想是将一个记录插入到已经排好序的有序序列...
  • u011116672
  • u011116672
  • 2015-12-03 14:54
  • 851

排序算法之(1)——冒泡排序

**【冒泡排序的思想】** 冒泡排序总共进行n-1趟,每一趟扫描总是通过两两比较把大的往后放,所以第一趟即把最大数放在最后面,接着第二趟把第二大数放在倒数第二的位置………….到n-1完成,此时只有一个数未排序,这个数就是最小元素,不再需要扫描,此时完成对所有元素的排序。
  • adminabcd
  • adminabcd
  • 2015-06-06 10:11
  • 874

Java数据结构与算法之常见排序算法总结

目录: 1.概述 2.常用排序方法总结 3.冒泡排序 4.选择排序 5.插入排序 6.归并排序 7.快速排序 8.shell排序 1.概述 学过排序算法的朋友可能都知道排序算法有很多种,那在实际应用中我们应该选择哪一种比较恰当呢?当然我们排序算法各有优势 的,在选择的时候也...
  • qq_28057577
  • qq_28057577
  • 2016-10-08 15:54
  • 609

Java排序算法之冒泡排序和选择排序

前言:纵然伤心,也不要愁眉不展,因为你不知是谁会爱上你的笑容。——泰戈尔 《飞鸟集》 原文出处: import java.util.Arrays; class Demo { public static void main(String[] args) { in...
  • u014158743
  • u014158743
  • 2016-09-19 23:14
  • 694

经典排序算法(1)——冒泡排序算法详解

冒泡排序(Bubble Sort)是一种典型的交换排序算法,通过交换数据元素的位置进行排序。 一、算法基本思想 (1)基本思想 冒泡排序的基本思想就是:从无序序列头部开始,进行两两比较,根据大小交换位置,直到最后将最大(小)的数据元素交换到了无序队列的队尾,从而成为有序序列的一部分;下一次继...
  • guoweimelon
  • guoweimelon
  • 2016-03-16 10:52
  • 20789

冒泡排序法--(单个for循环实现)

一.什么叫冒泡排序法? 比较相邻的元素,如果第一个比第二个大,就交换他们两个的位置,然后继续往下找二.两种冒泡排序法步骤: 对下列数组进行排序:(22,3,6,54,86,21,35,1,65,4) 1.普通的冒泡排序法: 实现步骤: 1:双层for循环嵌套; 2....
  • Mr_Huan
  • Mr_Huan
  • 2017-01-08 11:54
  • 2054
    个人资料
    • 访问:50943次
    • 积分:926
    • 等级:
    • 排名:千里之外
    • 原创:42篇
    • 转载:1篇
    • 译文:0篇
    • 评论:13条
    文章分类
    最新评论