`
wind_bell
  • 浏览: 291256 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

排序--冒泡排序

阅读更多

原理:
将被排序的记录数组R[1..n]垂直排列,每个记录R[i]看作是重量为R[i].key的气泡。根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R:凡扫描到违反本原则的轻气泡,就使其向上"飘浮"。如此反复进行,直到最后任何两个气泡都是轻者在上,重者在下为止

实现:

 private static void swap(int[] array, int i, int j)
 {
  int temp = array[i];
  array[i] = array[j];
  array[j] = temp;
  }

 public static void bubbleSort(int[] array)
 {
  int n = array.length;
  boolean swaped = false;

  for(int i = n - 1; i > 0; i--)
  {
   swaped = false;
   for(int j = 0 ; j < i; j++)
    if( array[j] > array[j + 1] )
    {
     swap(array, j, j + 1);
     swaped = true;
    }

   if (!swaped)
    break;
  }
 }

算法复杂度分析:

初始文件状态
正序
反序
无序
第i趟比较次数
n – i
n - i
n - i
总关键字比较次数
n -1  
n2 /2
n2 /2
第i趟移动次数
0
n - i
(n – i) / 2
总关键字移动次数
0
n2 /2
n2 /4
时间复杂度
O(n)
O(n2)
O(n2)

空间复杂O(1)

稳定性:
冒泡排序为稳定排序

算法改进:
增加一个lastExchanged标识位,标记一趟排序后最后一个发生交换的位置,则该位置往后都有序,不用在冒泡

 public static void bubbleSort(int[] array)
 {
  int n = array.length;
  boolean swaped = false;
  int lastExchanged = n - 1;
  int i = n - 1;
  int count = 0;

  while( i > 0 )
  {
   swaped = false;
   for(int j = 0 ; j < i; j++)
   {
    if( array[j] > array[j + 1] )
    {
     swap(array, j, j + 1);
     lastExchanged = j;
     swaped = true;
    }
    count++;
   }
   if (!swaped)
    break;
   i = lastExchanged;
  }
  System.out.println(count);
 }

实验结果,需要移动比较次数明显减少

分享到:
评论

相关推荐

    冒泡排序-排序过程 冒泡排序-排序过程

    ### 冒泡排序详解 #### 一、冒泡排序的基本概念与原理 冒泡排序是一种简单的排序算法,其基本思想是通过重复地遍历要排序的列表,比较相邻的两个元素,如果它们的顺序错误就把它们交换过来。遍历列表的工作是重复...

    排序-按键精灵-冒泡排序.png

    排序-按键精灵-冒泡排序

    MIPS-汇编语言-冒泡排序-含伪代码以及完整注释

    MIPS-汇编语言-冒泡排序-含伪代码以及完整注释,可以直接使用

    冒泡排序-冒泡排序冒泡排序-冒泡排序

    冒泡排序 冒泡排序 冒泡排序 冒泡排序 冒泡排序

    选择排序-插入排序-快速排序-冒泡排序

    本主题将详细探讨四种常见的排序算法:选择排序、插入排序、快速排序以及冒泡排序,它们都是用C语言实现的。以下是这些排序算法的详细解析: 1. **选择排序(Selection Sort)** - 选择排序是一种简单直观的排序...

    --C++冒泡排序--

    --C++冒泡排序--

    C语言排序算法---冒泡排序法

    **冒泡排序法详解** 冒泡排序是一种简单直观的排序算法,它重复地遍历待排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经...

    经典排序算法源代码-插入排序-选择排序-冒泡排序

    本资源包含三个经典的排序算法的源代码:插入排序、选择排序和冒泡排序,这些都是初级到中级程序员常学习和使用的算法。下面将详细介绍这三个排序算法的工作原理、特点以及代码实现。 1. **插入排序(Insertion ...

    数据结构:交换排序-冒泡排序实验指导

    ### 数据结构:交换排序-冒泡排序实验指导 #### 实验背景与目标 在计算机科学领域,数据结构和算法是核心研究对象,其中排序算法作为基础且重要的算法之一,广泛应用于各类数据处理场景。本实验旨在深入理解并掌握...

    S7-200SMART冒泡排序-优化版(可选择升序降序及数据类型等).zip

    《S7-200SMART PLC程序实现冒泡排序的优化与多样性》 在工业自动化领域,西门子S7-200SMART系列PLC因其小巧、灵活、功能强大而广泛应用于各种控制系统中。本篇文章将深入探讨如何在S7-200SMART PLC上实现冒泡排序...

    排序算法 -- 冒泡排序

    冒泡排序是一种基础且经典的排序算法,它的基本思想是通过不断地交换相邻的逆序元素,使得每一轮排序后,最大的元素“浮”到数组的末尾。这个过程就像水底下的气泡逐渐升至水面一样,因此得名“冒泡排序”。 在Java...

    冒泡排序-时间排序

    冒泡排序是一种基础且历史悠久的排序算法,它通过重复遍历待排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来,直到没有再需要交换的元素,即整个数列完成排序。这个过程就像水底下的气泡一样逐渐...

    C#四种排序方法--交换排序 选择排序 冒泡排序 插入排序

    交换排序 选择排序 冒泡排序 插入排序

    冒泡排序-14-表单提交.ev4.rar

    在这个"冒泡排序-14-表单提交.ev4.rar"压缩包中,很可能包含了一个关于冒泡排序的示例讲解,可能是一个教学视频"冒泡排序-14-表单提交.ev4.mp4"。 冒泡排序的基本思想是通过重复遍历待排序的数列,一次比较两个元素...

    冒泡排序---选择,插入和快速排序

    ### 冒泡排序(Bubble Sort) #### 定义与原理 冒泡排序是一种简单的排序算法,它重复地遍历待排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复进行的,直到没有再需要...

    TIA博途-冒泡排序SCL算法-全局FC库文件-V15版本.zip

    在本文中,我们将深入探讨TIA博途中的冒泡排序SCL算法以及如何在全局FC(功能块)库文件中实现这一算法。TIA博途是西门子的一款集成自动化软件,广泛应用于PLC(可编程逻辑控制器)编程,而SCL是一种高级编程语言,...

    冒泡排序-使用python实现的冒泡排序算法.zip

    冒泡排序是一种基础且经典的排序算法,它的基本思想是通过不断地交换相邻的逆序元素,使得每一趟排序后,最大的元素“浮”到数组的末尾。在这个过程中,就像水底下的气泡逐渐上浮一样,因此得名“冒泡排序”。在...

    Java代码-排序-直接插入排序、希尔排序、直接选择排序、冒泡排序、堆排序、快速排序、归并排序中部分排序以及算法-贪心法

    Java代码-排序-直接插入排序、希尔排序、直接选择排序、冒泡排序、堆排序、快速排序、归并排序中部分排序以及算法-贪心法,大家可以将源码下载下来进行学习,附带着注释和解释,有不理解的可以找博主一起探讨,共同...

    python冒泡排序-16-集合总结.ev4.rar

    标题中的“python冒泡排序-16-集合总结”表明这是一个关于Python编程的教程,具体聚焦于冒泡排序算法和集合的综合应用。冒泡排序是计算机科学中最基础的排序算法之一,而集合在Python中则是一种无序、不重复元素序列...

Global site tag (gtag.js) - Google Analytics