【java】简单排序

简单排序总结

1 冒泡排序

冒泡排序:这种排序是最容易理解的一种排序,就像河底的气泡往出冒一样,越来越大。冒泡排序就是用后面的和前面的比较,如果前面比后面大,那么就交换这两个值,一趟跑完了,再继续下一趟,直到全部有序。

代码实现

public class BubbleSort {
    public static void sort(int[]arr){
        long start =System.currentTimeMillis();
        int n=arr.length;
        if(n<=1){
            return;
        }
        for(int i=0;i<n-1;i++){
            boolean flag=true;
            for(int j=i+1;j<n;j++){
                if(arr[j]<arr[i]){
                    int tmp=arr[j];
                    arr[j]=arr[i];
                    arr[i]=tmp;
                    flag=false;
                }
            }
            if(flag){
                return;
            }
        }
        long end=System.currentTimeMillis();
        System.out.println("冒泡排序耗时"+(end-start)+"毫秒");
    }
}


冒泡排序性能分析:冒泡排序采用两层for循环实现,第一层for循环表示总共需要多少轮,第二层for循环来比较冒泡。最好的情况是原本就趋向于有序,只需要遍历一遍。最坏的情况是反向有序,每次比较都需要交换。

时间复杂度:最好O(N) 最坏O(N^2) 平均O(N^2) 空间复杂度:O(1)

稳定性:稳定

2 选择排序

选择排序:选择排序的原理是将区间分为待排序区间与已排序区间,每次选取待排序区间选取最小值放在待排序区间的第一个位置,然后该位置加入已排序区间。

public class ChoiceSort {
    public static void sort(int[]arr){
        long start=System.currentTimeMillis();
        int n=arr.length;
        if(n<=1){
            return;
        }
        int min=0;
        for(int i=0;i<arr.length;i++){
            min=i;
            for(int j=i+1;j<arr.length;j++){
                if(arr[j]<arr[min]){
                    min=j;
                }
            }
            if(min!=i){
                int tmp=arr[min];
                arr[min]=arr[i];
                arr[i]=tmp;
            }
        }
        long end=System.currentTimeMillis();
        System.out.println("选择排序耗时"+(end-start)+"毫秒");
    }
}

选择排序性能分析:选择排序与冒泡排序一样,同样采用两层for循环来实现。但是其比较次数最多只进行N次,依旧是第一次for循环的次数。

时间复杂度:最好 O(N^2) 最坏O(N^2) 平均O(N^2) 空间复杂度O(1)

稳定性:不稳定

3 插入排序

插入排序:插入排序同样是分为已排序区间和待排序区间,每次从待排序区间选择一个值,插入到已排序区间中的指定位置。

public class InsertSort {
    public static void sort(int[] arr){
        int n=arr.length;
        if(n<=1){
            return;
        }
        for(int i=1;i<arr.length;i++){
            int tmp=arr[i];
            int j=i-1;
            for(;j>=0;j--){
                if(arr[j]>tmp){
                    arr[j+1]=arr[j];
                }else {
                    break;
                }
            }
            arr[j+1]=tmp;
        }
    }
}

插入排序性能分析:

时间复杂度: 最好O(N^2) 最坏O(N) 平均O(N^2) 空间复杂度:O(1)

稳定性:稳定

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值