简单选择排序和冒泡排序

406 阅读3分钟

这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战

今天我们来讲一下两个简单的排序算法,分别是简单选择排序和冒泡排序

简单选择排序

基本思想

简单选择排序,这个法如其名,是一个十分简单的排序算法。

我们通过一个例子来帮助大家理解简单选择排序的过程以及思想,如下图:

image.png

假设箱子中有若干个标有数字的小球,你的任务就是按照从小到大的顺序将小球从箱子中取出来放好。

这时我们的脑海中就会随机选一个球,然后跟其他球进行比较,有更小的球就更新自己脑海中记住的那颗最小的球,直到比较完毕,我们就可以取出最小的球了,每次重复这个步骤,那我们最终就会将全部球按照从小到大取出来放好。

image.png

算法描述

而简单选择排序算法的思想也是如此。

刚开始时,整个数组处于未排序状态,在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

代码贴贴:

public void choose_sort(int[] nums){
    for (int i = 0; i < nums.length; i++) {
        int min = i;
        //选出之后待排序中值最小的位置
        for (int j = i + 1; j < nums.length; j++) {
            if (nums[j] < nums[min]) {
                min = j;
            }
        }
        //最小值不等于当前值时进行交换
        if (min != i) {
            int temp = nums[i];
            nums[i] = nums[min];
            nums[min] = temp;
        }
    }
}

选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对 n个元素的表进行排序总共进行至多 n-1 次交换在所有的完全依靠交换去移动元素的排序方法中,选择排序属于非常好的一种,但其不管数组如何有序,其每次都要遍历到尾部,是出了名的慢性子,时间复杂度为O(n^2)

稳定性

那简单选择排序是稳定还是不稳定呢?答案是不稳定的。举个例子[80,80,70],第一轮比较后,第一个元素跟第三个元素进行交换,这个时候就可以看出它是不稳定的排序算法了。

冒泡排序

基本思想

冒泡排序,是一种计算机科学领域的较简单基础的排序算法。其基本思路是,对于一组要排序的元素列,依次比较相邻的两个数,将比较小的数放在前面,比较大的数放在后面,如此继续,直到比较到最后的两个数,将小数放在前面,大数放在后面,重复步骤,直至全部排序完成。

这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。

算法描述

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后已经确定的元素。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

bubble.gif

代码贴贴:

public void sort(int[] nums) {
    //外层循环控制比较的次数
    for (int i = 0; i < nums.length - 1; i++) {
        //内层循环控制到达位置
        for (int j = 0; j < nums.length - i - 1; j++) {
            //前面的元素比后面大就交换
            if (nums[j] > nums[j + 1]) {
                int temp = nums[j];
                nums[j] = nums[j + 1];
                nums[j + 1] = temp;
            }
        }
    }
}

可以看出,冒泡排序的时间复杂度也是O(n^2)。

稳定性

冒泡排序是稳定的,原因在于在每次对相邻的比较中,只有大于或者小于才会交换元素,而等于的话是不进行交换的,不会破坏相同元素的相对位置。

结尾

本文介绍了两种简单的排序算法,分别为简单选择排序,冒泡排序,两种时间复杂度都为O(n^2)简单选择排序是不稳定的,而冒泡排序则是稳定的。