排序算法(冒泡、选择、插入、希尔)

冒泡排序

重复遍历数列 每次都遍历都将两个数按照一样的顺序调过来 直到排序完成

image

//冒泡排序
    public int[] bubble(int[] arr) {
        int temp;
        for (int i = 0; i < arr.length-1; i++) {
            for (int j=0;j<arr.length-i-1;j++){
                if (arr[j]>arr[j+1]){
                    temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
        return arr;
    }

选择排序

每次选择一个未排序序列中最小的元素 将其放置到数组前面 直到排序结束

image

//选择排序
    public int[] choose(int[] arr) {
        for (int i = 0; i < arr.length - 1; i++) {
            int index = i; //记录每轮循环的起始元素位置
            for (int j = i; j < arr.length; j++) {
                //向后遍历,更新记录最小值
                if (arr[index] > arr[j]) {
                    index = j;
                }
            }
            //将每轮的最小值与本轮起始元素调换
            int temp = arr[i];
            arr[i] = arr[index];
            arr[index] = temp;
        }
        return arr;
    }

插入排序

插入排序首先构建一个基本有序序列,然后将没有排序的元素向已经排序的序列中插入,类似于打扑克牌时的排序方法。

image

//插入排序
    public int[] insert(int[] arr) {
        // 从下标为1的元素开始选择合适的位置插入,因为下标为0的只有一个元素,默认是有序的
        for (int i = 1; i < arr.length; i++) {
            // 记录要插入的数据
            int tmp = arr[i];
            // 从已经排序的序列最右边的开始比较,找到比其小的数
            int j = i;
            while (j > 0 && tmp < arr[j - 1]) {
                arr[j] = arr[j - 1];
                j--;
            }
            // 存在比其小的数,插入
            if (j != i) {
                arr[j] = tmp;
            }
        }
        return arr;
    }

希尔排序

希尔排序也称递减增量排序算法,首先找到一个增量,然后按照这个增量遍历数组排序,之后缩小增量继续排序,直到增量为1后排序结束

转自五分钟学算法的演示图

image

//希尔排序
    public int[] shellSort(int[] arr) {
        int length = arr.length; //数组长度
        int temp;  //临时变量
        //将数组长度的一半作为第一次增量开始遍历  每轮都将增量折半递减
        for (int step = length / 2; step >= 1; step /= 2) {
            //用增量去向后遍历元素
            for (int i = step; i < length; i++) {
                temp = arr[i];//将每轮元素赋给临时变量
                int j = i - step;//找到增量对应的前一个元素
                while (j >= 0 && arr[j] > temp) {  //将两个元素排序调换
                    arr[j + step] = arr[j];
                    j -= step; //如果增量结束则跳出,如果满足下一次排序条件 则继续按照增量向下排序
                }
                arr[j + step] = temp;//调换元素位置
            }
        }
        return arr;
    }

以上图片转自菜鸟教程

posted @ 2022-06-29 21:59  Cloong  阅读(50)  评论(0)    收藏  举报