zoukankan      html  css  js  c++  java
  • 冒泡排序

    冒泡排序Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

    冒泡排序对n个项目需要O(n^2)的比较次数,且可以原地排序。尽管这个算法是最简单了解和实作的排序算法之一,但它对于少数元素之外的数列排序是很没有效率的。

    冒泡排序是与插入排序拥有相等的执行时间,但是两种法在需要的交换次数却很大地不同。在最坏的情况,冒泡排序需要O(n^2)次交换,而插入排序只要最多O(n)交换。冒泡排序的实现(类似下面)通常会对已经排序好的数列拙劣地执行(O(n^2)),而插入排序在这个例子只需要O(n)个运算。因此很多现代的算法教科书避免使用冒泡排序,而用插入排序取代之。冒泡排序如果能在内部循环第一次执行时,使用一个旗标来表示有无需要交换的可能,也有可能把最好的复杂度降低到O(n)。在这个情况,在已经排序好的数列就无交换的需要。若在每次走访数列时,把走访顺序和比较大小反过来,也可以稍微地改进效率。有时候称为往返排序,因为算法会从数列的一端到另一端之间穿梭往返。

    冒泡排序算法的运作如下:

    1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
    2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
    3. 针对所有的元素重复以上的步骤,除了最后一个。
    4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
        1 // 参考白话经典算法之冒泡排序的思想
        2 #include <stdio.h>
        3 
        4 void SwapValue(int *OperatorA, int *OperatorB)
        5 {
        6     if ((NULL == OperatorA) || (NULL == OperatorB))
        7     {
        8         printf ("Invalid Parameter(s)!\n");
        9         return;
       10     }
       11 
       12     if ((*OperatorA) != (*OperatorB))
       13     {
       14         *OperatorA ^= *OperatorB;
       15         *OperatorB ^= *OperatorA;
       16         *OperatorA ^= *OperatorB;
       17     }
       18 }
       19 
       20 void BabbleSort(int *a, int N)
       21 {
       22     if ((NULL == a) || (N <= 0))
       23     {
       24         printf ("Invalid Parameter(s)!\n");
       25         return;
       26     }
       27 
       28     for (int i = 0; i < N; ++i)
       29     {
       30         for (int j = 1; j < (N - i); ++j)
       31         {
       32             if (a[j] < a[j-1])
       33             {
       34                 SwapValue (&a[j], &a[j-1]);
       35             }
       36         }
       37     }
       38 }
       39 
       40 // 优化一,若排序在循环完成之前完成,则循环不必继续下去
       41 void BabbleSort1(int *a, int N)
       42 {
       43     if ((NULL == a) || (N <= 0))
       44     {
       45         printf ("Invalid Parameter(s)!\n");
       46         return;
       47     }
       48 
       49     bool bFlag = true;
       50     int nLength = N;
       51 
       52     while (bFlag)
       53     {
       54         bFlag = false;
       55         for (int i = 1; i < nLength; ++i)
       56         {
       57             if (a[i] < a[i-1])
       58             {
       59                 SwapValue (&a[i], &a[i-1]);
       60                 bFlag = true;
       61             }
       62         }
       63 
       64         --nLength;
       65     }
       66 }
       67 
       68 // 优化二,若数组后面已经有序且都比前面的大,则没有必要将他们参与到排序中
       69 void BabbleSort2(int *a, int N)
       70 {
       71     if ((NULL == a) || (N <= 0))
       72     {
       73         printf ("Invalid Parameter(s)!\n");
       74         return;
       75     }
       76 
       77     int nFlag = N;
       78     int nLength;
       79 
       80     while (nFlag > 0)
       81     {
       82         nLength = nFlag;
       83         nFlag = 0;
       84 
       85         for (int i = 1; i < nLength; ++i)
       86         {
       87             if (a[i] < a[i-1])
       88             {
       89                 SwapValue (&a[i], &a[i-1]);
       90                 nFlag = i;
       91             }
       92         }
       93     }
       94 }
       95 
       96 int main(void)
       97 {
       98     int a1[9] = {9, 8, 7, 6, 5, 4, 3, 2, 1};
       99     int a2[9] = {9, 8, 7, 6, 5, 4, 3, 2, 1};
      100     int a3[9] = {9, 8, 7, 6, 5, 4, 3, 2, 1};
      101 
      102     BabbleSort(a1, 9);
      103     BabbleSort1(a2, 9);
      104     BabbleSort2(a3, 9);
      105 
      106     for (int i = 0; i < 9; ++i)
      107     {
      108         printf ("%d ", a1[i]);
      109     }
      110 
      111     printf ("\n");
      112 
      113     for (int i = 0; i < 9; ++i)
      114     {
      115         printf ("%d ", a2[i]);
      116     }
      117 
      118     printf ("\n");
      119 
      120     for (int i = 0; i < 9; ++i)
      121     {
      122         printf ("%d ", a3[i]);
      123     }
      124 
      125     printf ("\n");
      126 
      127     return 0;
      128 }

  • 相关阅读:
    .net Delegate
    Kaprekar constant(卡普雷卡尔黑洞)
    How to get URL and QueryString value in an ASP.NET page
    Jquery and ashx achieve login of ajax
    MAC 开发笔记——Objective C 语法之Category和Extension
    MAC 开发笔记 - ObjectiveC 语法之selector
    肮脏的选择
    MAC Air 使用手记
    MAC 开发笔记——Objective C 之 基础设计模式
    太平洋战争——比B.o.B还是差了点
  • 原文地址:https://www.cnblogs.com/ldjhust/p/2986048.html
Copyright © 2011-2022 走看看