Java排序算法之冒泡排序

写在前面的话:这段时间在学习排序算法,想把学习的内容总结一下。从最简单的排序算法开始吧。

Java算法之冒泡排序

基本过程:对于一个要排序的数列,我们从复遍历这个数列,一次比较两个数,如果他们顺序错误,我们就交换他们位置。遍历工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

Java代码实现:

public class Maopao {
    
    public static void main(String[] args) {
        
        int [] s = {8,3,2,1,7,4,6,5};
        int temp = 0;
        for(int i=0;i<s.length-1;i++){
            for(int j=0;j<s.length-1-i;j++){
                if(s[j]>s[j+1]){
                    temp=s[j];
                    s[j]=s[j+1];
                    s[j+1]=temp;
                }
            }
        }
        for(int value:s)
        System.out.print(value);
    }

}

代码优化:上面代码会出现多余的比较,因为排序可能已经完成,但循环还没有结束,这样就会进行多余的比较。

public class Maopao {
    
    public static void main(String[] args) {
        
        int [] s = {8,3,2,1,7,4,6,5};
        int temp = 0;
        for(int i=0;i<s.length-1;i++){
            boolean flag = false;//每次重置标记为false
            for(int j=0;j<s.length-1-i;j++){
                if(s[j]>s[j+1]){
                    temp=s[j];
                    s[j]=s[j+1];
                    s[j+1]=temp;
                    flag=true;
                }
            }
            if(!flag) break;//如果没有交换跳出循环
        }
        for(int value:s)
        System.out.print(value);
    }

}

在分析算法性能之前先了解一些概念:

  时间复杂度:需要排序的的关键字的比较次数和相应的移动的次数。

     空间复杂度:分析需要多少辅助的内存。

     稳定性:如果记录两个关键字的A和B它们的值相等,经过排序后它们的位置没有发生交换,那么我们称这个排序算法是稳定的。否则我们称这个排序算法是不稳定的。

算法性能分析:

时间复杂度:若原始序列为"正序",则比较次数为n-1次,无需交换。若原始序列为逆序则比较次数和交换次数都为n(n-1)/2;因此冒泡排序总的时间复杂度为O(n*n)。

空间复杂度:冒泡排序空间复杂度很好,它只需要一个附加单元用于数据交换,所以其空间复杂度为O(1)。

稳定性:冒泡排序是基于相邻元素的比较,若两个元素相等,按照冒泡排序的思想是不会进行交换的。所以排序后位置不会发生改变。算法是稳定的。

原文地址:https://www.cnblogs.com/love-Stefanie/p/6635322.html