排序之冒泡排序

来源:互联网 发布:音频矩阵处理器 编辑:程序博客网 时间:2024/06/05 07:37

冒泡排序思想

对于一个数字序列来说,我们可以依次比较相邻的两项数字,假如相邻的两项分别记为A和B。如果A的值大于B,那么进行A、B之间顺序的交换,将较大值移到后面。之后再用第二个值与第三个值进行比较,将较大的值放到后面,以此类推。

冒泡排序示例

每次遍历一次序列,都会找到一个数的最终位置。文字讲解会比较抽象,以下为具体事例:

假设一个序列为:24 ,12,42,67,53,21,90,69

则排序过程如下:

第一趟排序(找0~n-1序列中最大的值,并放在最后的位置):
12,24,42,53,21,67,69,90
第二趟排序(找0~n-2序列中的最大值,放在倒数第二位置):
12,24,42,21,53,67,69,90
第三趟排序(确定倒数第三个位置)
12,24,21,42,53,67,69,90
第四趟排序(确定倒数第四个位置)
12,21,24,42,53,67,69,90

之后进行第五趟排序,在进行第五趟排序中发现当前序列中没有发生位置转换,则说明序列已经有序。

冒泡排序代码实现

private static void performSort(int[] array) {        int length = array.length;        //设置一个变量值,标记是否进行了序列移动        boolean flag = true;        while (flag) {            flag = false;            for (int i = 1; i < length; i++) {                if (array[i - 1] > array[i]) {                    int temp = array[i];                    array[i] = array[i - 1];                    array[i - 1] = temp;                    flag = true;                }            }            --length;        }    }

冒泡排序性能分析

(1)时间复杂度
在设置标志变量之后:
当原始序列“正序”排列时,冒泡排序总的比较次数为n-1,移动次数为0,也就是说冒泡排序在最好情况下的时间复杂度为O(n);

当原始序列“逆序”排序时,冒泡排序总的比较次数为n(n-1)/2,移动次数为3n(n-1)/2次,所以冒泡排序在最坏情况下的时间复杂度为O(n^2);

当原始序列杂乱无序时,冒泡排序的平均时间复杂度为O(n^2)。

(2)空间复杂度
冒泡排序排序过程中需要一个临时变量进行两两交换,所需要的额外空间为1,因此空间复杂度为O(1)。

(3)稳定性
冒泡排序在排序过程中,元素两两交换时,相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。

原创粉丝点击