java之数据结构-排序(一)

60 阅读5分钟
  1. 基于对java数据结构的理解,将java数据结构排序做一个小的汇总,分上下两版完成.
  2. 本次汇总中提供代码讲解,代码中不清楚地方都已通过注解完成
  3. 代码是通过运行验证可行的(大家可以通过实际操作理解)
  4. 文章末尾我会将代码上传云端,感兴趣的朋友可以下载执行运行

一、选择排序

1.1简单选择排序

1.1.1 定义

  1. 选择排序:通俗理解就是将一组待排序的数组,

    反复取出待排序中最小值,「所以在程序嵌套二次循环中j的初始值为j=i+1,j长度为数组长度,每次j++」

    ,依次进行排序的过程(比如一组数组[2,4,3,1],第一次将最小值1取出放到起始位置,第二次将剩下最小的取出放到1后面,依次类推,直到取完)

1.1.2 简单选择排序功能方法

/**
     * 选择排序:即扫描全部数组,找出最小的置换到第一位,在此扫描剩下的,找出最小置换到第二位...依次类推直到置换完成为止
     * @param arr
     */
    public void selectorSort(int arr[]){
        for (int i = 0; i < arr.length; i++) {
            System.out.println("当前数组下标:"+i);
            int minIndex = i; //第一次循环置换的时候将数组中第一个值作为最小值
            //注意:j初始值为i+1,循环嵌套目的是
            // -1.为了将默认当前的最小值和数组中其他值依次比较,直到找出最小的值的下标
            // -2.找出最小的值并没有结束,而是接着和数组中其他值比较,直到确认当前下标值为最小值
            // -3.否则最小下标值被剩下数组的最小下标值置换
            for (int j = i+1 ; j < arr.length; j++) {
                System.out.println("arr["+minIndex+"]:"+arr[minIndex]);
                System.out.println("arr["+j+"]:"+arr[j]);
                if (arr[minIndex]>arr[j]){
                    minIndex = j; //目的就是找出数组中最小的下标值
                    System.out.println("循环扫描中当前最小下标minIndex:"+minIndex);
                }
            }
            System.out.println("实际最小下标minIndex:"+minIndex+",第【"+(i+1)+"】次扫描当前最小值为:"+arr[minIndex]);
            if (minIndex != i){
                int t;
                t = arr[i];
                arr[i] = arr[minIndex];  //第一次扫描将最小值置换到第一个位置,以后依次类推
                arr[minIndex] = t;  //将初始化到数组值置换到原来最小值位置,以后依次类推
            }
            System.out.println("输出第【"+(i+1)+"】次置换结果:"+Arrays.toString(arr));
            System.out.println("------------------------------------------------");
        }
        System.out.println("输出最终结果:"+Arrays.toString(arr));
    }
}

1.1.3 举例调用过程

public class sortTest {
    public static void main(String[] args) {
        SortMethodUtils sortMethodUtils = new SortMethodUtils();
        int arr[] ={3,9,6,1,2};
        System.out.println("----选择排序-----");
        sortMethodUtils.selectorSort(arr);
    }
}


选择排序流程图:

在这里插入图片描述

1.1.4 运行结果

----选择排序-----
当前数组下标:0
arr[0]:3
arr[1]:9
arr[0]:3
arr[2]:6
arr[0]:3
arr[3]:1
循环扫描中当前最小下标minIndex:3
arr[3]:1
arr[4]:2
实际最小下标minIndex:3,第【1】次扫描当前最小值为:1
输出第【1】次置换结果:[1, 9, 6, 3, 2]
------------------------------------------------
当前数组下标:1
arr[1]:9
arr[2]:6
循环扫描中当前最小下标minIndex:2
arr[2]:6
arr[3]:3
循环扫描中当前最小下标minIndex:3
arr[3]:3
arr[4]:2
循环扫描中当前最小下标minIndex:4
实际最小下标minIndex:4,第【2】次扫描当前最小值为:2
输出第【2】次置换结果:[1, 2, 6, 3, 9]
------------------------------------------------
当前数组下标:2
arr[2]:6
arr[3]:3
循环扫描中当前最小下标minIndex:3
arr[3]:3
arr[4]:9
实际最小下标minIndex:3,第【3】次扫描当前最小值为:3
输出第【3】次置换结果:[1, 2, 3, 6, 9]
------------------------------------------------
当前数组下标:3
arr[3]:6
arr[4]:9
实际最小下标minIndex:3,第【4】次扫描当前最小值为:6
输出第【4】次置换结果:[1, 2, 3, 6, 9]
------------------------------------------------
当前数组下标:4
实际最小下标minIndex:4,第【5】次扫描当前最小值为:9
输出第【5】次置换结果:[1, 2, 3, 6, 9]
------------------------------------------------
输出最终结果:[1, 2, 3, 6, 9]

Process finished with exit code 0

二 插入排序

2.1 直接插入排序

2.1.1 定义

  1. 插入排序: 通俗理解就是相当于我们玩牌,起好牌之后,我们会按照从大到小或从小到大的顺序重新排序

  2. [实际定义] 指在待排序的元素中,假设前面n-1(其中n>=2)个数已经是排好顺序的,现将第n个数插到前面已经排好的序列中,然后找到合适自己的位置,使得插入第n个数的这个序列也是排好顺序的。按照此法对所有元素进行插入,直到整个序列排为有序的过程,称为插入排序
    3.基于其定义,

    代码思路:在嵌套方法中第二次循环中,j初始化值为i(根据定义,i前面的是排序好的,需要将i和i-1之前的值进行比较),由于每次比较j都需要减1,因此j必须为大于0的值,所以j>0,j–;

2.1.2 插入排序功能方法

public void insertSort(int arr[]){
        for (int i = 1; i <arr.length; i++) { //从第二个开始和其前面到比较,比前面到小到插入到前面
            for (int j = i; j >0 ; j--) {
                //arr[j]当前值也就是要和j之前的数值比较插入其前面的值,arr[j-1]前一个值
                if (arr[j] < arr[j-1]){ //如果比前一个小
                    int temp = arr[j-1];  //1.先将前一个值给到第三个参数
                    arr[j-1] = arr[j]; //2.将当前值给到前一个值
                    arr[j] = temp; //把1中最初的前一个值给到当前值,完成交换
                }else{
                    break;
                }
            }
            System.out.println("第【"+i+"】次插入排序结果:"+Arrays.toString(arr));
        }
        System.out.println("最终排序结果:"+Arrays.toString(arr));
    }

2.1.3 举例调用过程

public class sortTest {
    public static void main(String[] args) {
        SortMethodUtils sortMethodUtils = new SortMethodUtils();
        int arr[] ={3,9,6,1,2};
        System.out.println("----插入排序-----");
        sortMethodUtils.insertSort(arr);

    }
}


插入排序的流程图分析:

在这里插入图片描述

2.1.4 运行结果

运行结果:

----插入排序-----
第【1】次插入排序结果:[3, 9, 6, 1, 2]
第【2】次插入排序结果:[3, 6, 9, 1, 2]
第【3】次插入排序结果:[1, 3, 6, 9, 2]
第【4】次插入排序结果:[1, 2, 3, 6, 9]
最终排序结果:[1, 2, 3, 6, 9]

Process finished with exit code 0