`

冒泡排序基本思想和算法

阅读更多
交换排序的基本思想是:两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止。
     应用交换排序基本思想的主要排序方法有:冒泡排序和快速排序。


冒泡排序

1、排序方法

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

(2)第一趟扫描
    从无序区底部向上依次比较相邻的两个气泡的重量,若发现轻者在下、重者在上,则交换二者的位置。即依次比较(R[n],R[n-1]),(R[n-1], R[n-2]),…,(R[2],R[1]);对于每对气泡(R[j+1],R[j]),若R[j+1].key<R[j].key,则交换R[j +1]和R[j]的内容。
     第一趟扫描完毕时,"最轻"的气泡就飘浮到该区间的顶部,即关键字最小的记录被放在最高位置R[1]上。

(3)第二趟扫描
    扫描R[2..n]。扫描完毕时,"次轻"的气泡飘浮到R[2]的位置上……
     最后,经过n-1 趟扫描可得到有序区R[1..n]
  注意:
    第i趟扫描时,R[1..i-1]和R[i..n]分别为当前的有序区和无序区。扫描仍是从无序区底部向上直至该区顶部。扫描完毕时,该区中最轻气泡飘浮到顶部位置R[i]上,结果是R[1..i]变为新的有序区。

2、冒泡排序过程示例
     对关键字序列为49 38 65 97 76 13 27 49的文件进行冒泡排序的过程【参见动画演示

3、排序算法
(1)分析
     因为每一趟排序都使有序区增加了一个气泡,在经过n-1趟排序之后,有序区中就有n-1个气泡,而无序区中气泡的重量总是大于等于有序区中气泡的重量,所以整个冒泡排序过程至多需要进行n-1趟排序。
    若在某一趟排序中未发现气泡位置的交换,则说明待排序的无序区中所有气泡均满足轻者在上,重者在下的原则,因此,冒泡排序过程可在此趟排序后终止。为 此,在下面给出的算法中,引入一个布尔量exchange,在每趟排序开始前,先将其置为FALSE。若排序过程中发生了交换,则将其置为TRUE。各趟 排序结束时检查exchange,若未曾发生过交换则终止算法,不再进行下一趟排序。

(2)具体算法
 

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->void BubbleSort(SeqList R)
   { 
//R(l..n)是待排序的文件,采用自下向上扫描,对R做冒泡排序
     int i,j;
     Boolean exchange; 
//交换标志
     for(i=1;i<n;i++){ //最多做n-1趟排序
       exchange=FALSE; //本趟排序开始前,交换标志应为假
       for(j=n-1;j>=i;j--//对当前无序区R[i..n]自下向上扫描
        if(R[j+1].key<R[j].key){//交换记录
          R[0]=R[j+1]; //R[0]不是哨兵,仅做暂存单元
          R[j+1]=R[j];
          R[j]
=R[0];
          exchange
=TRUE; //发生了交换,故将交换标志置为真
         }
       
if(!exchange) //本趟排序未发生交换,提前终止算法
             return
     } 
//endfor(外循环)
    } //BubbleSort
(4)Java版冒泡排序源码:
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->/**
 * 
 * 
@author supercrsky
 *
 
*/
public class BubbleSort
{
    
static int[] swap(int[] arr)
    {
        
for(int i = 0; i < arr.length; i ++)
        {
            
//切记,每次都要从第一个开始比。最后的不用再比。
            for(int j = 0; j < arr.length - i - 1; j ++)
            {
                
//比较相邻的两个数,如果后面的数小就交换
                if(arr[j] > arr[j+1])
                {
                    
int temp = arr[j];
                    arr[j] 
= arr[j+1];
                    arr[j
+1= temp;
                }
            }
        }
        
return arr;
    }
    
    
static void print(int[] arr)
    {
        
for(int i = 0; i < arr.length; i++)
        {
            System.out.println(arr[i]);
        }
    }
    
    
public static void main(String[] args)
    {
        
int arr[] = {8,2,1,0,4,11,20,80,99,70,33};
        print(swap(arr));
    }
}



々上善若水々 2007-12-10 22:08 发表评论
分享到:
评论

相关推荐

    冒泡排序基本思想和算法冒泡排序基本思想和算法.

    下面对冒泡排序的基本思想、算法和性能进行详细的分析。 冒泡排序基本思想 冒泡排序的基本思想是:两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止。这种思想可以应用于...

    冒泡排序的基本算法

    虽然冒泡排序在实际应用中并不常见,但它在教学和理解排序算法的基本原理上具有重要意义。初学者可以通过学习冒泡排序来掌握排序算法的基本思路,为进一步学习更复杂的算法打下基础。 综上所述,冒泡排序是一种基础...

    快速排序算法和冒泡排序效率对比

    快速排序和冒泡排序是两种常见的排序算法,它们在计算机科学中扮演着重要的角色,特别是在数据处理和优化程序性能方面。本篇文章将深入探讨这两种排序算法的原理、效率以及它们在C#编程语言中的实现。 首先,让我们...

    C++语言的算法实现包括插入排序冒泡排序堆排序快速排序

    本文将深入探讨四种在C++中实现的常见排序算法:插入排序、冒泡排序、堆排序和快速排序。这些算法各有特点,适用于不同的场景,理解并掌握它们对于提升编程能力至关重要。 1. **插入排序**: 插入排序是一种简单的...

    JAVA冒泡排序和快速排序算法

    冒泡排序是一种简单直观的排序算法,它的基本思想是通过重复遍历待排序的数列,依次比较相邻元素并交换位置,使得较大的元素逐渐“浮”到数列的末尾,就像水底下的气泡逐渐升至水面一样。具体步骤如下: 1. 遍历...

    冒泡排序算法的C++函数模板

    冒泡排序算法是简单的排序算法之一,它的主要思想是通过反复比较相邻元素,将小的元素逐步移到序列的开始位置,而大的元素逐步移到序列的末尾位置,以达到排序的目的。下面是冒泡排序算法的C++函数模板的详细说明: ...

    冒泡排序 算法(冒泡,选择,插入,数组排序)

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

    Java冒泡排序算法

    冒泡排序的基本思想是:比较相邻的元素。如果第一个比第二个大,就交换它们两个。对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。针对所有的元素重复以上的...

    最快的排序算法 C语言最简单的排序算法冒泡排序并返回排序前索引序号,排序算法数据结构

    冒泡排序是一种简单的排序算法,它的主要思想是通过不断地比较相邻元素,并交换它们以达到排序的目的。在C语言中,冒泡排序的实现非常简单,下面我们将详细介绍冒泡排序的实现过程。 冒泡排序的实现步骤: 1. 首先...

    C#四种排序算法(冒泡排序)

    在C#编程中,排序算法是数据处理和分析的基础,常见的有冒泡排序、插入排序、选择排序和希尔排序。这四种排序算法各有特点,适用不同的场景。 1. **冒泡排序**: 冒泡排序是一种简单的排序算法,通过不断交换相邻...

    c语言冒泡排序资源-排序算法

    冒泡排序是一种简单而直观的排序算法,其基本思想是通过不断比较相邻的元素并交换它们,从而将较大的元素逐步推向数组的末尾,最终实现整个数组的有序排列。程序开始时,打印出原始的未排序数组,然后通过两层嵌套...

    学习排序算法之冒泡排序及其优化笔记.pdf

    冒泡排序算法是一种简单的排序算法,基本思想是通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的大小,若发现逆序则交换,使较大的元素逐渐从前移向后部,就像水底下的气泡一样逐渐向上冒。...

    排序:插入排序,选择排序,基数排序,冒泡排序

    在本文中,我们将深入探讨四种经典的排序算法:插入排序、选择排序、基数排序和冒泡排序,以及它们在C++语言中的实现。 **插入排序(Insertion Sort)** 插入排序是一种简单直观的排序算法,它的工作原理类似于我们...

    易语言冒泡排序算法

    通过学习易语言实现冒泡排序,不仅可以掌握基本的排序算法,还能熟悉易语言的语法和编程思维,这对于初学者来说是一个很好的起点。同时,理解并实践冒泡排序也有助于进一步学习更高级的排序算法,如快速排序、归并...

    TIA博途中实现冒泡排序的两种SCL语言算法.docx

    冒泡排序是一种基础且高效的排序算法,其基本思想是通过不断地交换相邻的逆序元素,逐步将较大的元素“冒泡”到序列的末尾。在TIA博途中,我们可以使用结构化控制语言(SCL)来实现这个算法。TIA博途是一款由西门子...

    冒泡排序和选择排序算法的动态演示程序.pdf

    冒泡排序和选择排序是两种基础的排序算法,它们在计算机科学中有着广泛的应用,特别是在理解和教学算法原理时。这两种排序方法都是通过比较数组中的元素来实现排序的,但它们的工作方式有所不同。 **冒泡排序**...

    数组应用及冒泡排序算法示例学习

    冒泡排序是一种简单的排序算法,它的基本思想是通过重复遍历待排序的数组,比较相邻元素并交换位置(如果需要的话),直到数组中的所有元素都按照指定顺序排列。冒泡排序的名字来源于排序过程中较小的元素像气泡一样...

Global site tag (gtag.js) - Google Analytics