在JAVA代码中说明、GIF中理解4个基本排序(选择、冒泡、插入、希尔)

说在前面:
数组arr = {3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};
让数组从小到大排序
所有排序法如果不理解,极其建议自行在草稿纸中按代码走一遍,可以更好的理解

个人博客文章地址

一、选择排序

主要思路:第一趟,从第一个数开始,让它与之后的每一个数进行比较,如果发现有比它大的,则记录下标和该数,然后用记录的数继续往后比较,如此一来,就可以找到第一个最小的数,让它与第一个数进行交换即可,然后从第二个数继续,以此类推。

GIF演示(源自网络):
在这里插入图片描述
代码实现:

    //选择排序
    public static void selectionSort(int[] arr){

        //定义一个数,用于记录找到的数
        int temp = 0;
        //第一层for循环为执行的总次数,因为执行到倒数第二个数是,数组已经有序,故arr.length -1
        for(int i = 0; i < arr.length -1; i++){
            //用于记录下标
            int index = i;
            //这里是从i开始后的所有数都要进行比较
            for (int j = i + 1;j < arr.length; j++){
                //如果发现有比arr[i]大的,则更新下标,这样是为了最终找到最小的那个数的下标
                if (arr[index] > arr[j]){
                    index = j;
                }
            }
            //如果进入循环前的i发生了变化,则证明有数更小,并且更小的数,下标为j,直接交换即可
            if (index != i){
                temp = arr[index];
                arr[index] = arr[i];
                arr[i] = temp;
            }
        }
    }

效果:
在这里插入图片描述

二、冒泡排序

主要思路:每一趟都让前后两个数进行比较,如果发现后面的数较小,则互换位置,一趟下来,就能将最大的数放在最后,数组长减1趟下来即可完成排序

GIF演示(源自网络):
在这里插入图片描述
代码实现:

    //冒泡排序
    public static void bubbleSort(int[] arr){
        //用来记录数据,便于互换数据
        int temp = 0;
        //当倒数第二个数确定,则无需继续排序。故为arr.length -1次
        for (int i = 0; i < arr.length -1; i++){
            /*从第一个数开始,让它跟往后一个数进行比较,然后如此类推,因为第一层每执行完一趟,
              都会确定数组末尾的一个数,已确定的数不需要加入比较,固有arr.length - i
              同时,每一次剩最后两个数时只需要执行一次,所以arr.length - i -1次
             */
            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;
                }
            }
        }
    }

三、插入排序

主要思路:首先将一个数组看成一个有序数组和无序数组,即:一开始,将第一个数看成是一个有序数组,往后的是一个无序数组,然后将后面的数一个个插入到第一个有序数组中

GIF演示(源自网络):
在这里插入图片描述
代码实现:

    //插入排序
    public static void insertSort(int[] arr){
        //用于记录数据以及下标
        int temp = 0 , j = 0;
        //从第二个数(即 i = 1)开始进行对前面进行插入
        for(int i = 1; i < arr.length; i++){
            //记录这个数以及下标
            temp = arr[i];
            j = i;

            //记录下的temp比它前面的数(j - 1)要小,则往前插入,当j = 0时为最前面的数了,所以结束
            while (j > 0 && temp <arr[j - 1]){
                //直接让在自己前面的数将自己覆盖(可以看成是前面的数往后退了),因为已经用temp记录下来了
                arr[j] = arr[j-1];
                //然后继续往前找
                j--;
            }
            //循环结束后,则说明已经找到了位置,而且下标为j,直接插入即可
            arr[j] = temp;
        }
    }

四、希尔排序

主要思路;希尔排序就算插入排序的增强版(防止出现最小的数在最后,就要进行多次交换才插入到第一的情况),它是先将一个数组,不停的看成是arr.length/2个数组(直到arr.length/2 = 1 时,就变成了一个数组),然后对它们进行插入排序

GIF演示(源自网络):
在这里插入图片描述
代码:

    //希尔排序
    public  static void SellSort(int[] arr){
        /*不停对 原数组 进行分组,step为每个数组的元素之间 的距离
        (这里是看作是不同数组,实际在同一个数组中)
          不停的缩小距离(step),则是将数组分得更小,直到step = 1(成为一个数组)
         */
        for(int step = arr.length/2; step > 0 ; step = step/2){

            /*
             从下标step开始为一个数组的第二个数,然后进行插入排序
             step + 1 为下一个数组第二个数,进行插入排序,以此类推
             */
            for (int i = step ; i < arr.length; i++){
                //这操作与插入排序相同,结合插入排序理解

                //记录数以及下标
                int j = i;
                int temp = arr[j];
                //数组的前一个数(arr[j - step])比trmp大则继续插入,当(j - step) > 0 则说明已经到了数组最前面的数
                while ((j - step) > 0 && arr[j - step] > temp){
                    arr[j] = arr[j - step];
                    j = j - step;
                }
                //找到位置则插入
                arr[j] = temp;
            }
        }
    }

完整代码

public class Sort {
    public static void main(String[] args) {
        int[] arr = {3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};
        System.out.println("排序前:");
        for(int a : arr){
            System.out.print( a + ",");
        }
        //选择排序
        //selectionSort(arr);
        //冒泡排序
        //bubbleSort(arr);
        //插入排序
        //insertSort(arr);
        //希尔排序
        SellSort(arr);
        System.out.println("\n\r排序后:");
        for(int a : arr){
            System.out.print( a + ",");
        }
    }


    //选择排序
    public static void selectionSort(int[] arr){

        //定义一个数,用于记录找到的数
        int temp = 0;
        //第一层for循环为执行的总次数,因为执行到倒数第二个数是,数组已经有序,故arr.length -1
        for(int i = 0; i < arr.length -1; i++){
            //用于记录下标
            int index = i;
            //这里是从i开始后的所有数都要进行比较
            for (int j = i + 1;j < arr.length; j++){
                //如果发现有比arr[i]大的,则更新下标,这样是为了最终找到最小的那个数的下标
                if (arr[index] > arr[j]){
                    index = j;
                }
            }
            //如果进入循环前的i发生了变化,则证明有数更小,并且更小的数,下标为j,直接交换即可
            if (index != i){
                temp = arr[index];
                arr[index] = arr[i];
                arr[i] = temp;
            }
        }
    }

    //冒泡排序
    public static void bubbleSort(int[] arr){
        //用来记录数据,便于互换数据
        int temp = 0;
        //当倒数第二个数确定,则无需继续排序。故为arr.length -1次
        for (int i = 0; i < arr.length -1; i++){
            /*从第一个数开始,让它跟往后一个数进行比较,然后如此类推,因为第一层每执行完一趟,
              都回确定数组末尾的一个数,已确定的数不需要加入比较,固有arr.length - i
              同时,每一次剩最后两个数时只需要执行一次,所有arr.length - i -1次
             */
            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;
                }
            }
        }
    }

    //插入排序
    public static void insertSort(int[] arr){
        //用于记录数据以及下标
        int temp = 0 , j = 0;
        //从第二个数(即 i = 1)开始进行对前面进行插入
        for(int i = 1; i < arr.length; i++){
            //记录这个数以及下标
            temp = arr[i];
            j = i;

            //记录下的temp比它前面的数(j - 1)要小,则往前插入,当j = 0时为最前面的数了,所以结束
            while (j > 0 && temp <arr[j - 1]){
                //直接让在自己前面的数将自己覆盖(可以看成是前面的数往后退了),因为已经用temp记录下来了
                arr[j] = arr[j-1];
                //然后继续往前找
                j--;
            }
            //循环结束后,则说明已经找到了位置,而且下标为j,直接插入即可
            arr[j] = temp;
        }
    }

    //希尔排序
    public  static void SellSort(int[] arr){
        /*不停对 原数组 进行分组,step为每个数组的元素之间 的距离
        (这里是看作是不同数组,实际在同一个数组中)
          不停的缩小距离(step),则是将数组分得更小,直到step = 1(成为一个数组)
         */
        for(int step = arr.length/2; step > 0 ; step = step/2){

            /*
             从下标step开始为一个数组的第二个数,然后进行插入排序
             step + 1 为下一个数组第二个数,进行插入排序,以此类推
             */
            for (int i = step ; i < arr.length; i++){
                //这操作与插入排序相同,结合插入排序理解

                //记录数以及下标
                int j = i;
                int temp = arr[j];
                //数组的前一个数(arr[j - step])比trmp大则继续插入,当(j - step) > 0 则说明已经到了数组最前面的数
                while ((j - step) > 0 && arr[j - step] > temp){
                    arr[j] = arr[j - step];
                    j = j - step;
                }
                //找到位置则插入
                arr[j] = temp;
            }
        }
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值