算法与数据结构——排序(二)冒泡排序(上)

     排序里面最简单的一种排序就是冒泡排序。冒泡排序,这个名字叫得非常形象,它的意思就是整个排序的过程就好像一个气泡从水底慢慢升起一样。气泡从水底升起的过程,气泡越变越大。所以一次冒泡排序,要么最大的数跑到最顶端去了,要么最小的数跑到最顶端去了。下面的例子中,我们以冒泡排序一次,最小的数跑到顶端去为例。图中左边为顶端,右边为底端。

     我们要排序的列表是{5,7,9,2,6,3,1,4,8}。首先来看最简单的一种冒泡排序;

     第一步,把第一个数和其他的每一个数进行比较,如果后面的某一个数比第一个数还要小,那么就把后面的那个数与第一个数进行交换,然后继续进行比较。如下面的左图所示,第一个数为5,把5与后面的每个数进行比较,注意当比较到每4步的时候,由于2比5小,所以这个时候5与2要交换位置,那么2就变成了第一个数了,然后就拿2与后面的数据来比较。要明白我们是拿第一个数与剩下的数比较,也就是拿数组a[0]与后面的数进行比较,a[0]的值随时在变化。

     第二步,把第二个数(也就是a[1]的值)与后面的数进行比较,如果后面有数比它小,那么也交换位置。经过第一次比较过后,第二个数就是7。那么就拿7与后面的进行比较,在第三次比较的时候,7会与5交换位置,交换后就拿5进行比较。与上面一样,这次是拿a[1]的值进行比较,a[1]的值可能在变。

     第三步,第四步,……第N步,同理。

冒泡排序image

    根据上面的思路,冒泡排序的简单实现如下:

   

public List<int> SimpleBuble(List<int> sortList)
      {
          for (int i = 0; i < sortList.Count; i++)
          {
              for (int j = i + 1; j < sortList.Count; j++)
              {
                  if (sortList[i] > sortList[j])
                  {
                      int temp = sortList[i];
                      sortList[i] = sortList[j];
                      sortList[j] = temp;
                  }
              }
             
          }
          return sortList;
      }

这是最简单的一种冒泡排序,我们思考一下,这种排序有没有什么问题?思考后我们就会发现,这种排序的方法,第一次冒泡只能把最小的排到前面来,后面的顺序仍然是乱的。也就是说第一次冒泡的结果又第二冒泡时没有一点帮助,很显然这样排序是很低效的。那么我们能不能对这种方法进行改进呢?

原文地址:https://www.cnblogs.com/xiaoxiangfeizi/p/2725152.html