插入排序

public void insertSort1(int[] a){
        // 遍历除了第一个元素外的所有元素,
        // 即将初始无序区内的元素一一插入有序区
        for (int i = 1; i < a.length; i++){
            // 存放插入元素,即有序区的下一个
            int temp = a[i];
            // 定义j变量,并初始化,j变量用于插入位置的定位
            int j = 0;
            // 搜寻插入位置
            for (j = i - 1; j >= 0; j--){
                // 从有序区最后一个元素开始比较,若比较的元素比
                // 插入的元素大则比较的元素往右移一位
//                if (temp < a[j])
                if (a[j] >= temp)
                    a[j + 1] = a[j];
                // 若比较的元素比插入元素小,结束比较
                // 因为是有序区(最大的都比其小,所以其前面的会比其小),
                // 所以没有必要再比下去,直接跳出
//                if(temp > a[j])
                if (a[j] < temp)
                    break;
            }
            // 将插入元素插入到搜寻到的合适位置
            a[j + 1] = temp;
            // 查看每一步插入的情况
            System.out.println(Arrays.toString(a));
        }
    }
public void insertSort2(int[] arr){
        for (int i=1; i<arr.length;i++){
            if (arr[i] < arr[i-1]){
                int temp = arr[i];
                int j;
                for (j= i-1;j>=0;j--){
                    if (arr[j] >= temp)
                        arr[j+1] = arr[j];
                    else
                        break;
                }
                arr[j+1] = temp;
            }
        }
    }



最好的情况    比较    +    移动    (也就是要排序的表本身就是有序的)
             n-1          0        ->    O(n)

最坏         n^2          n^2      ->    O(n^2)    (也就是逆序)


如果排序记录是随机的,
平均比较与移动次数约为n^2/4
所以得出直接插入排序的时间复杂度为O(n^2)

同样是O(n^2) 时间复杂度,直接插入排序比冒泡排序和简单选择排序的性能要好一些。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值