数据结构之八大排序算法(一、二)


前言

冒泡排序和选择排序是数据结构中最基本的排序算法,其中也是最常用的排序算法,下面我们的学习基本上是以思路分析、代码演示为主。


一、冒泡排序

冒泡排序(Bubble Sorting)的基本意思是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现则逆序交换,使值较大的元素逐渐从前向后移动。

因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行交换,就说明排序有序,因此要在排序的过程中设置一个标志flag判断元素是否进行过交换。从而减少不必要的比较。

1.冒泡排序案例加图解分析

在这里插入图片描述
下面是代码

public class Sort {
    
    
    public static void main(String[] args) {
    
    
        int[] arr = {
    
    3, 9, -1, 10, -2};
        int temp = 0;
        for (int i = 0; i < arr.length - 1; i++) {
    
    
            for (int j = 0; j < arr.length - 1 - i; j++) {
    
    
                //如果前面的数比后面的数大,就交换位置,否则就不交换
                if (arr[j] > arr[j + 1]) {
    
    
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
            System.out.println(Arrays.toString(arr));
        }
    }
}

根据上面的思路,我们可以对代码进行改进,增加一个flag标志来判断是否需要全部比较。

public class Sort {
    
    
    public static void main(String[] args) {
    
    
        int[] arr = {
    
    3, 9, -1, 10, 20};
        int temp = 0;
        boolean flag = false;
        for (int i = 0; i < arr.length - 1; i++) {
    
    
            for (int j = 0; j < arr.length - 1 - i; j++) {
    
    
                //如果前面的数比后面的数大,就交换位置,否则就不交换
                if (arr[j] > arr[j + 1]) {
    
    
                    flag = true;
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
            if (!flag) {
    
    
                //在一趟排序中,一次交换都没有发生
                break;
            } else {
    
    
                //重置flag,进行下次判断
                flag = false;
            }
            System.out.println(Arrays.toString(arr));
        }
    }
}

2.时间性能测试

我们可以使用random生成八万个随机数,然后使用冒泡排序进行排序,最后得到的时间为差不多11s(根据电脑不同可能会有所差异),可以看出这种排序方式的效率并不是很高。

二、选择排序

1.选择排序介绍

择排序也是一种简单的排序方法。它的基本思想是:第一次从arr[0]arr[n-1]中选取最小值,与arr[0]交换,第二次从arr[1]arr[n-1]中选取最小值,与arr[2]交换。。。一共通过n-1次,得到一个按顺序从小到大的有序序列。

在这里插入图片描述
选择排序代码实现:

/**
     * 选择排序
     * 时间复杂度 O(n^2)
     */
    public static void selectSort(int[] arr) {
    
    
        for (int i = 0; i < arr.length - 1; i++) {
    
    
            int minIndex = i;
            int min = arr[i];
            for (int j = i + 1; j < arr.length; j++) {
    
    
                //找到最小值
                if (min > arr[j]) {
    
    
                    min = arr[j];
                    minIndex = j;
                }
            }
            //交换
            if (minIndex != i) {
    
    
                arr[minIndex] = arr[i];
                arr[i] = min;
            }
            System.out.println("第" + (i+1) + "轮交换后:");
            System.out.println(Arrays.toString(arr));
        }
    }

2.时间性能测试

我们同样可以使用random生成八万个随机数,然后使用选择排序进行再次测试,最后得到的时间为差不多2s(根据电脑不同可能会有所差异),可以看出选择排序在性能上是要比冒泡排序快很多的。

扫描二维码关注公众号,回复: 13447556 查看本文章

猜你喜欢

转载自blog.csdn.net/z318913/article/details/121485977
今日推荐