DAY003_选择排序、冒泡排序、插入排序

发布时间 2023-08-24 14:40:03作者: loveeeeee

选择排序

第一遍遍历:从头开始,找到最小值的坐标,将最小值和数组第一个元素对调
第二遍遍历:从第二个元素开始,找到最小值的坐标,将最小值和数组第二个元素对调
第三遍遍历:从第三个元素开始,找到最小值的坐标,将最小值和数组第三个元素对调
....

冒泡排序

第一遍遍历:只要前数比后数大就交换,一遍之后最大元素被移动到最后
第二遍遍历:还是从头来,只要前数比后数大就交换,一遍之后,次大的元素被移动到倒数第二个位置
第三遍遍历:还是从头来,只要前数比后数大就交换,一遍之后,第三大的元素被移动到倒数第三个位置
...

插入排序

第一遍遍历:插入第一个元素,不动
第二遍遍历:插入第二个元素,依次和它前面的元素比较看看能否互换,直到无法互换
第三遍遍历:同上
...

代码

点击查看代码
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ArrayUtil;
import org.junit.Test;

import java.util.Arrays;

public class Day003_选择排序冒泡排序插入排序 {

    @Test
    public void test01(){
        for (int p = 0; p < 10000; p++) {
            for (int i = 1; i < 4; i++) {
                int[] xx = 随机等概率生成一个数组.invoke(50, -30, 50);
                int[] xxClone = ArrayUtil.clone(xx);

                System.out.println(Arrays.toString(xx));
                System.out.println(Arrays.toString(xxClone));
                Assert.isTrue(ArrayUtil.equals(xx, xxClone));

                if (i == 1) {
                    sort1(xx);
                } else if (i == 2) {
                    sort2(xx);
                } else {
                    sort3(xx);
                }
                Arrays.sort(xxClone);

                System.out.println(Arrays.toString(xx));
                System.out.println(Arrays.toString(xxClone));
                Assert.isTrue(ArrayUtil.equals(xx, xxClone));
                System.out.println("=========================");
            }
        }
    }

    /**
     * 选择排序
     */
    private void sort1(int[] xx) {
        System.out.println("选择排序");
        for (int i = 0; i < xx.length; i++) {
            int minIndex = i;
            for (int j = i + 1; j < xx.length; j++) {
                if (xx[j] < xx[minIndex]) {
                    minIndex = j;
                }
            }

            swap(xx, i, minIndex);
        }
    }

    /**
     * 冒泡排序
     */
    private void sort2(int[] xx) {
        System.out.println("冒泡排序");
        for (int i = xx.length - 1; i > 0; i--) {
            for (int j = 0; j < i; j++) {
                if (xx[j] > xx[j + 1]) {
                    swap(xx, j, j + 1);
                }
            }
        }
    }

    /**
     * 插入排序
     */
    private void sort3(int[] xx) {
        System.out.println("插入排序");
        for (int i = 0; i < xx.length; i++) {
            for (int j = i; j - 1 >= 0; j--) {
                if (xx[j] < xx[j - 1]) {
                    swap(xx, j, j - 1);
                }
            }
        }
    }

    /**
     * 交换
     */
    private void swap(int[] xx, int x, int y) {
        int temp = xx[x];
        xx[x] = xx[y];
        xx[y] = temp;
    }
}

public class 随机等概率生成一个数组 {

    public static int[] invoke(int max, int min, int length) {
        int[] xx = new int[length];
        for (int i = 0; i < xx.length; i++) {
            //生成一个 [0,N] 的整数
            int i1 = (int) (Math.random() * (max + 1 - min));
            int i2 = i1 + min;
            if (i2 > max || i2 < min) {
                throw new RuntimeException("报错啦");
            }
            xx[i] = i2;
        }
        return xx;
    }

    /**
     * 相邻两个元素不相等
     */
    public static int[] invoke1(int max, int min, int length) {
        int[] xx = new int[length];
        for (int i = 0; i < xx.length; i++) {
            //生成一个 [0,N] 的整数
            do {
                int i1 = (int) (Math.random() * (max + 1 - min));
                int i2 = i1 + min;
                if (i2 > max || i2 < min) {
                    throw new RuntimeException("报错啦");
                }
                xx[i] = i2;
            } while (i > 0 && xx[i] == xx[i - 1]);
        }
        return xx;
    }
}