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 }

  • 相关阅读:
    184. Department Highest Salary【leetcode】sql,join on
    181. Employees Earning More Than Their Managers【leetcode】,sql,inner join ,where
    178. Rank Scores【leetcode】,sql
    177. Nth Highest Salary【leetcode】,第n高数值,sql,limit,offset
    176. Second Highest Salary【取表中第二高的值】,sql,limit,offset
    118. Pascal's Triangle【LeetCode】,java,算法,杨辉三角
    204. Count Primes【leetcode】java,算法,质数
    202. Happy Number【leetcode】java,hashSet,算法
    41. First Missing Positive【leetcode】寻找第一个丢失的整数,java,算法
    删除
  • 原文地址:https://www.cnblogs.com/ldjhust/p/2986048.html
Copyright © 2011-2022 走看看