2020/07/14-数组---插值、删除、插入排序、选择排序

2020/07/14-数组—插值、删除、插入排序、选择排序

一、在一串排好序的数组中新增一个数,仍保持初始的排序方式

思路:

  • (假如开始数组是3位,需要添加1位数字,则重新建一个4位数组,
  • 重新建一个更大的数组的原因是最开始创建数组时并不知道后来要添加几位数,
  • 故开始只创建所需个数的数组长度)
  • 思路:素组增加元素需要增减数组容量
  • 如果增加1个数,则需要重新定义一个比之前大1位的数组
  • 再利用for循环将前一个数组装进新的数组
  • 新的数组的最后1位是空的
public class demo4 {
    
    
    public static void main(String[] args) {
    
    
        int[] a = {
    
    99,85,45,56,21};
        int[] b = new int[6];
        for (int i = 0; i < a.length; i++) {
    
    
            b[i] = a[i];//b的最后一位没有赋值,相当于空,默认是0,
                        // 之后往里面添加数字相当于覆盖
        }
        System.out.println(Arrays.toString(b));
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个数:");
        int num = sc.nextInt();
        boolean isInsert = false;
        for (int i = b.length-2; i >=0; i--) {
    
     //-2是因为b本身大一位,且下标需小一位
            if(num>b[i]){
    
    //从后向前遍历,从大到小排序,将更小的数放进数组b的最后一个空位
                b[i+1]=b[i];//下标后移
            }else {
    
    
                b[i+1]=num;
                isInsert = true;
                break;
            }

        }
            if(isInsert==false){
    
      //原数组所有数都比新增加的数小,故将新增加的数放在首位
                b[0]=num;
            }
        System.out.println(Arrays.toString(b));
    }
}

二、从数组中删除一个数

思路:

  • 与在数组中增加一个数类似,重新创建一个新的小一位的数组
  • 键入想要删除的数字在数组中的下标
  • 利用for循环,将原数组中的数放进新数组,到i=该下标时,
  • contiune跳过此次循环。
public class test3 {
    
    
    public static void main(String[] args) {
    
    
        int[] a = {
    
    99,85,80,63,60};
        int[] b = new int[4];
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入要删除的下标:");
        int num = sc.nextInt();
        int j = 0;
        for (int i = 0; i < a.length; i++) {
    
    
            if(i==num) continue;
            b[i] = a[i];
            j++;
        }
        System.out.println(Arrays.toString(b));
    }
}

三、将一串给定数组元素使用选择排序的方法升序排序

  • 【基本排序方法:选择排序、冒泡排序、插入排序】【高级排序算法:快速排序、归并排序】
  • 思路:
  • 外层循环定义每次的a[i]值位最小值,将该a[i]值与其后的每一个值作比较,标记最小值以及最小值下标
  • 将外层循环定义的a[i]赋值给标记的最小值的下标对应的数组,再将标记的最小值赋值给a[i]
  • 这其中需要引入一个变量来存储下标
  • 需要注意的是,在定义该变量时不能定义成1,或某一个固定值,
  • 而应将其定义成i,因为不一定每一次比较都产生交换,也有可能会保持原有位置不变
public class demo5 {
    
    
    public static void main(String[] args) {
    
    
        /*
选择排序逻辑:
从前向后对每一个下表对应的元素作为基准值
与后面所有的元素进行比较,找出最小值
与当前下标的元素进行交换
进行下一次循环
 */       int[] a={
    
    7,6,2,5,8,4,12,3};
        //i代表选取的基准位,j代表的在动的
        for(int i=0;i<a.length-1;i++){
    
    
            int min=a[i];
            int tmp=i;
            for (int j = i; j <a.length ; j++) {
    
    
                if(min>a[j]){
    
    
                    min=a[j];
                    tmp=j;
                }
            }
            a[tmp]=a[i];
            a[i]=min;
        }
        System.out.println(Arrays.toString(a));

        }
    }

四、插入排序法

  • 思路:外层循环从第2项开始,每次与前面的数依此比较。
  • 例如:a[1]:将于a[0]比较,如果a[1]大,将a[0]赋给a[1]
  • a[2]:与0,1下标数组比较
public class demo6 {
    
    
    public static void main(String[] args) {
    
    
        /*
        逻辑:从第二位开始,向前比较,进行插入逻辑
         */
        boolean isInsert = false;
        int[] a = {
    
    1,3,8,2,5,7};
        for (int i = 1; i < a.length; i++) {
    
    
            int tmp = a[i];
            for (int j = i-1; j >=0 ; j--) {
    
    
               //如果遇到比自己大的,大的值就后移
                // 如果遇到比自己小的,就在后方插入
                //如果一直没有插入,就插入首位
                if(tmp<a[j]){
    
    
                    a[j+1]=a[j];
                }else
                {
    
     a[j+1]=tmp;
                   isInsert = true;
                   break;}
            }
            if (isInsert!=true){
    
    
                a[0]=tmp;
        }

        }
        System.out.println(Arrays.toString(a));
    }
}

猜你喜欢

转载自blog.csdn.net/qq_42005540/article/details/107349192