【Java—直接插入排序、选择排序】完整代码及性能分析

1.直接插入排序

直接插入排序类似于打扑克牌时拿到一张牌,将这张牌插入到手里已经排好序的牌中。

即每次选择无序区间的第一个元素,在有序区间内选择合适的位置插入。

例如一个无序数组

         10   6    3    1    8

数组下标: 0    1    2    3    4

对这组数据进行排序,我们从无序区间中取一个元素即就是从下标1开始,记为 i,需要与有序区间比较,即取下标为0,记为 j,定义了两个循环,每次i++;j–;每次 i 值确定后设置一个tmp变量来存放 i 的值,比较array[ i ] 和array[ j ] 的大小,即对array[ j ]和 tmp 比较大小。
伪代码:

 if(array[ j ] > tmp){
 array[ j+1 ] = array[ j ];
 }else{
 array[ j+1 ]+1 = tmp;//将tmp放入原位置;
break}

此时注意:要考虑到当j < 0 时,要退出循环,此时代码:array[ j+1 ]+1 = tmp不能放在j的循环中,修改代码为

for (int i = 1; i <array.length ; i++) {
            int tmp = array[i];
            int j =i-1;
            for (; j >=0 ; j--) {
                if (array[j]>tmp){
                    array[j+1] =array[j];
                }else {
                    break;
                }
            }
            array[j+1]=tmp;
        }

完整代码及代码测试:

import java.util.Arrays;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: HuYu
 * Date: 2021-06-24
 * Time: 19:30
 */
public class InsertSort {
    public static  void  insertsort(int[] array){
        for (int i = 1; i <array.length ; i++) {
            int tmp = array[i];
            int j =i-1;
            for (; j >=0 ; j--) {
                if (array[j]>tmp){
                    array[j+1] =array[j];
                }else {
                    break;
                }
            }
            array[j+1]=tmp;
        }
    }
    public static void main(String[] args) {
        int[] array = {1,123,56,8,99,13};
        System.out.println(Arrays.toString(array));
        insertsort(array);
        System.out.println(Arrays.toString(array));
    }
}

运行结果:
在这里插入图片描述

性能分析:

空间复杂度:0(1)
时间复杂度:最坏情况下 0(n^2) 最好情况下可以达到 *0(n)*即有序时。
稳定性:稳定的

if (array[j]>tmp)这里不取等号时即为有序的。

2.选择排序

每次从无序区间选出比有序区间最后一个元素小的元素,存放在有序区间的最后,直到每一次无序区间循环完,直到全部待排序的数据元素排完 。

定义两个循环,每次直到 j 循环完,选出 j 循环中比 i 中小的进行交换。
代码:

import java.util.Arrays;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: HuYu
 * Date: 2021-06-26
 * Time: 17:23
 */
public class SelectSort {
    public static void main(String[] args) {
        int[] array = {1, 123, 56, 8, 99, 13, 567, 23, 4, 76};
        System.out.println(Arrays.toString(array));
        selectSort(array);
        System.out.println(Arrays.toString(array));
    }

    public static void selectSort(int[] array) {
        for (int i = 0; i < array.length; i++) {
            for (int j = i + 1; j < array.length; j++) {
                if (array[i] > array[j]) {
                    int tmp = array[i];
                    array[i] = array[j];
                    array[j] = tmp;
                }
            }
        }

    }
}

运行结果:
在这里插入图片描述

性能分析:

空间复杂度:0(1)
时间复杂度:最坏情况下 0(n^2) 最好情况下可以达到 *0(n)*即有序时。
稳定性:稳定的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值