数据结构与算法(三):浅识冒泡、选择、插入排序算法

数据结构于算法(一):数组
数据结构与算法(二):稀疏数组
前两篇我们浅浅的了解了一下数组以及稀疏数组的用法和特性,而在数组中我们实现的数据结构是无序的,也是纯纯按照插入顺序进行排序的,那么如何对数组中的元素进行排序呢?如何实现数组中的元素从大到小排序以及元素从小到大排序,而在数据结构中我们经常注意的问题之一就是效率问题,那么我们使用那种方法能达到对数组元素进行排序而且同时也能实现较高的效率呢?

1、冒泡排序

在了解冒泡排序之前,首先了解一下冒泡的含义,又为什么使用这个名词来体现这个排序算法呢?我们知道,在河水中,水泡刚从水底冒出来的时候是比较小的,随着慢慢向水面浮起水泡会逐渐增大,而在这一过程中,水泡由小到大,是不是可以横向类比于数组中的元素从小到大进行排序呢。因此冒泡排序也类似于此。

冒泡排序的运作规律:

  • 比较相邻的元素,如果第一个比第二个数值大,就交换它们两个。
  • 对每一对相邻元素做同样的比较工作,从开始第一对到结尾的最后一对,这步做完之后,最后的元素将会是数组中最大的数(也就意味着第一波冒泡完成)。
  • 对于数组中所有的元素重复以上的操作,除了最后一个。
  • 持续每次对越来越少的元素重复上述操作,直到没有任何一对元素需要对比即可。
  • 在这里插入图片描述
    代码实现如下:
    public static int[] sort(int[] array){
    
    
        //这里是for循环表示总共需要多少轮
        for (int i = 1; i < array.length; i++) {
    
    
            //设定一个标记,若为true,则表示此次循环没有进行交换,也就是待排序列已经有序,排序已经完成
            boolean flag = true;
            //这里的for循环表示每轮比较参与元素的下标
            //对当前无序区间array[0......length-i]进行排序的
            //j的范围很关键,这个范围是在逐步缩小的,因为每轮比较都会将最大的放在最右边
            for (int j = 0; j < array.length - i; j++) {
    
    
                if (array[j] > array[j+1]){
    
    
                    int temp = array[j];
                    array[j] = array[j+1];
                    array[j+1] = temp;
                    flag = false;
                }
            }
            if (flag){
    
    
                break;
            }
        }
        return array;
    }

下面经过测试来验证正确性:

    public static void main(String[] args) {
    
    
        int[] array = {
    
    4,5,2,7,8,1,3};
        System.out.println("未排序数组的顺序");
        for (int i : array) {
    
    
            System.out.print(i+" ");
        }
        System.out.println();
        System.out.println("-------------------------");
        System.out.println("经过冒泡排序后数组顺序");
        int[] sort = sort(array);
        for (int i : sort) {
    
    
            System.out.print(i+" ");
        }

    }

打印结果如下:
在这里插入图片描述
冒泡排序解析:
冒泡排序是由两个for循环构成,第一个for循环的变量 i 表示总共有多少轮比较,第二个for循环的变量 j 表示每轮参与比较的元素的下标[ 0,1…,length-i],因为每轮比较都会有一个最大的元素排到最右边,所以每轮比较之后都会少一个元素,这也是为什么 j 的范围是逐渐减小的。

2、选择排序

选择排序时每一次从待排序的元素中选出最小的一个元素,存放在序列的起始位置,直到元素排序完成。

选择排序的运作规律:

  • 从待排序序列中,找到数值最小的元素
  • 如果最小的元素不是待排序序列的第一个元素,将其和第一个元素互换
  • 从余下的N-1个元素中,找出数值最小的元素,重复前两步,直到排序结束
    在这里插入图片描述
    代码实现如下:
   public static int[] sort(int[] array){
    
    

        //总共要经过N-1轮比较
        for (int i = 0; i < array.length-1; i++) {
    
    
            int min = i;
            for (int j = i+1; j < array.length; j++) {
    
    
                if (array[min] > array[j]){
    
    //判断两个值的大小,将小的值的下标赋值给min
                    min = j;
                }
            }
            //将找到的最小值和i 位置所在的值进行交换
            if (i != min){
    
    
                int temp = array[i];
                array[i] = array[min];
                array[min] = temp;
            }
        }
        return array;
    }

测试代码如下:

    public static void main(String[] args) {
    
    
        int[] array = {
    
    2,4,6,7,1,3,5,9};

        System.out.println("未排序数组的顺序");
        for (int i : array) {
    
    
            System.out.println(i+" ");
        }
        System.out.println("-----------------------");
        System.out.println("经过选择排序后的数组顺序为:");
        int[] sort = sort(array);
        for (int i : sort) {
    
    
            System.out.println(i+" ");
        }
    }

打印结果如下:
在这里插入图片描述

3、插入排序

插入排序基本思想是将每一步将一个待排序的记录,插入到前面已经排序好的有序序列中去,直到插完所有元素为止。
在这里插入图片描述
代码如下:

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

测试代码如下:

    public static void main(String[] args){
    
    
        int[] array = {
    
    4,2,8,9,5,7,6,1,3};
        //未排序数组顺序为
        System.out.println("未排序数组顺序为:");
        for (int i : array) {
    
    
            System.out.print(i+" ");
        }
        System.out.println();
        System.out.println("-----------------------");
        System.out.println("经过插入排序后的数组顺序为:");
        int[] sort = sort(array);
        for (int i : sort) {
    
    
            System.out.print(i+" ");
        }
    }

打印结果如下:
在这里插入图片描述

4、总结

在学习数据结构的过程中我们关注的重点是进行一项操作的效率(时间复杂度),而不是是否可以达到我们想要的效果,对于上述三种排序来说都可以完成我们想要的结果,但是对于三种排序的时间复杂度还没有分析,在后续的学习中,我会分别补增上对三者的时间复杂度的分析以及性能的分析过程。

三种排序都学会了,能不能开心的动动小手给自己点个赞!
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Gaowumao/article/details/122651328