这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战
今天我们来讲一下两个简单的排序算法,分别是简单选择排序和冒泡排序
简单选择排序
基本思想
简单选择排序,这个法如其名,是一个十分简单的排序算法。
我们通过一个例子来帮助大家理解简单选择排序的过程以及思想,如下图:
假设箱子中有若干个标有数字的小球,你的任务就是按照从小到大的顺序将小球从箱子中取出来放好。
这时我们的脑海中就会随机选一个球,然后跟其他球进行比较,有更小的球就更新自己脑海中记住的那颗最小的球,直到比较完毕,我们就可以取出最小的球了,每次重复这个步骤,那我们最终就会将全部球按照从小到大取出来放好。
算法描述
而简单选择排序算法的思想也是如此。
刚开始时,整个数组处于未排序状态,在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
代码贴贴:
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],第一轮比较后,第一个元素跟第三个元素进行交换,这个时候就可以看出它是不稳定的排序算法了。
冒泡排序
基本思想
冒泡排序,是一种计算机科学领域的较简单基础的排序算法。其基本思路是,对于一组要排序的元素列,依次比较相邻的两个数,将比较小的数放在前面,比较大的数放在后面,如此继续,直到比较到最后的两个数,将小数放在前面,大数放在后面,重复步骤,直至全部排序完成。
这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。
算法描述
- 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
- 针对所有的元素重复以上的步骤,除了最后已经确定的元素。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
代码贴贴:
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),简单选择排序是不稳定的,而冒泡排序则是稳定的。