在我们的业务中,有很多情况都需要根据某种需要针对要返回的数据进行排序,但是排序是一种非常耗时的操作,特别是当数据量大的时候,所有有时候我们也会说,数据的排序是很重要的,但是也是非常耗时间的。在这里简单介绍一下简单排序,这些排序算法执行速度较慢,但算法逻辑简单,在某些时候,比其他的复杂排序算法更加有效,同时也能帮助我们理解其他的复杂排序算法。

一、冒泡排序

 冒泡算法的排序规则:重复比较相邻的两个元素,如果第一个比第二个大,就交换两个元素的位置,重复这个动作,就可以将最大值移动到后面。一趟(从第一个要比较的元素到最后一个要比较的元素)可以选择出一个未比较的数列中最大的元素,重复到最后没有要比较的元素的时候,完成排序。

冒泡算法的步骤如下:

  • 计算出要排序的数组a的大小n,数组下标从0开始。
  • 设置一个标志位标识已经排序的数组下标位置,即i=n-1(表示还没有开始排序)。
  • 令j=0,1,2.....i-1,循环比较a[j]和a[j+1]的大小,如果a[j]>a[j+1],那么交换两者的值。
  • 令i=i-1,循环进行上一步的处理,直到i<0为止。  

 时间复杂度:

  不管数组初始状态是什么样的,都需要进行n-1趟排序,每趟排序比较n-j次比较,如果初始状态是排序好的,那么移动次数为0。如果初始状态是反序的,那么每次比较移动3次。计算时间负责度计算式如下:假设比较次数C和移动次数M。

  Cmin = n(n-1)/2 = O(n2), Mmin = 0

  Cmax = n(n-1)/2 = O(n2), Mmax = 3n(n-1)/2 = O(n2)

  所以时间复杂度比较为O(n2)

代码如下:

 1   /**
 2      * 冒泡排序<br/>
 3      * 不变性,在坐标大于i的部分永远是有序的,也就是说在排序过程中不会改变此部分的排列
 4      * 
 5      * @param array
 6      */
 7     public void bubbleSort(double[] array) {
 8         if (array == null || array.length < 2) {
 9             return;
10         }
11 
12         int size = array.length;
13         for (int i = size - 1; i >= 0; i--) {
14             for (int j = 0; j < i; j++) {
15                 if (Double.compare(array[j], array[j + 1]) > 0) {
16                     // swap the datas
17                     array[j] = array[j] + array[j + 1];
18                     array[j + 1] = array[j] - array[j + 1];
19                     array[j] = array[j] - array[j + 1];
20                 }
21             }
22         }
23     }
Bubble Sort Code

相关文章: