Java中的排序,冒泡,插入和选择

一、冒泡排序
1.比较相邻的元素,如果前一个元素大于后一个元素就交换它们二个
2.第一遍比较完之后,最大的元素就在最后一个
3.下一次比较就少比较一次
4.持续每次对越来越少的元素重复上面的步骤,直到排序完成。
5.时间复杂度:O(n2)
稳定性:稳定

private static void bubbleSort(int[] arr) {
        for (int i = 0; i < arr.length - 1; i++) {
            boolean swap=false;//优化
            for (int j = 0; j < arr.length - i - 1; j++) {
                if (arr[j] > arr[j + 1]) {
                    int tmp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = tmp;
                    swap=true;
                }
            }
            if(!swap){
                break;
            }
        }
    }

二、插入排序
1.从第一个元素开始,该元素可以认为已经排好序。
2.取出下一个元素,然后把这个新元素在i经排好序的元素序列中从后往前扫描进行比较。
3.如果该元素(已排序)大于新元素,则将这个元素小于或者等于元素的位置。
4.重复步骤3,查到找到一排序的元素小于或者等于新元素的位置。
5.将新元素插入到该一排序的元素的索引位置后面。
6.重复步骤2—5。
7.稳定性:稳定

public static void insertSort(int[] arr) {
        for (int i = 1; i < arr.length; i++) {
            int val = arr[i];
            //在i前面已经排序好的序列中,找i元素插入的合适的位置
            int j = i - 1;
            //优化成二分查找合适的插入位置,不再使用线性查找
            //0  j   找第一个小于val的值
            for (; j >= 0; j--) {
                if (val < arr[j]) {
                    arr[j + 1] = arr[j];
                } else {
                    //把val元素插入到当前位置,然后循环结束
                    break;
                }
            }
            arr[j + 1] = val;
        }
    }
}

三、选择排序
给一个定数组,第一次做循环判断时只需要保证你数组的第一数是最小的,即:将第一个数和第二个数比较,如果第二个数比第一个数小,就将两个数交换,然后再比较第一个数和第三个数,若第三个数还小,就继续交换,总之,把小的往前丢。
时间复杂度:O(n^2) 空间复杂度O(1)
稳定性:不稳定

public static void choiceSort(int[] arr) {
        for (int i = 0; i < arr.length - 1; i++) {
            int min = arr[i];
            int k = i;
            for (int j = i+1; j < arr.length; j++) {
                if (min > arr[j]) {
                    min = arr[j];
                    k = j;
                }
            }
            if (k!=i){
                int tmp=arr[i];
                arr[i]=arr[k];
                arr[k]=tmp;
            }
        }
    }

这些排序的效率:插入>选择>冒泡

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值