目录
很多小伙伴对冒泡排序和选择排序傻傻分不清楚,今天我把这两个排序放在一起,希望能帮助大家更好的理解它们!
扫描二维码关注公众号,回复:
11173955 查看本文章
一、冒泡排序:
1、排序原理
从左到右,数组中相邻的两个元素进行比较,将较大的放到后面。
2、原理图
例如:int [] a = {3,7,6,4,2};
第一轮排序:比较了4次,本轮排序结束后数组变成了{3,6,4,2,7},如下图:
第二轮排序:比较了3次,本轮排序结束后数组变成了{3,4,2,6,7},如下图:
以此类推...
3、代码实现
根据上图规律,实现如下代码,即是冒泡排序法:
/**
* 冒泡排序
* N个数字冒泡排序,总共要进行N-1轮比较,每轮的排序次数为(N-i)次比较
*
* @author 百里慕溪
*/
public static void bubbleSort(int[] array) {
// 一定要记住判断边界条件,很多人不注意这些细节
if (array == null || array.length < 2) {
return;
}
// 需要进行array.length轮比较
for (int i = 0; i < array.length - 1; i++) {
// 第i轮比较
for (int j = 0; j < array.length - i - 1; j++) {
// 开始进行比较,如果array[j]比array[j+1]的值大,那就交换位置
if (array[j] > array[j + 1]) {
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
}
运行结果:
二、选择排序
1、排序原理
第n次循环拿数组中第n个位置上的值和该位置以后的所有元素中最小的比较,如果第n个位置上的值比后面的最小的值大,那就和最小的值换位。
2、原理图
第一轮排序:比较4次,本轮排序结束数组变成了{2, 7, 6, 4, 3},如下图:
第二轮排序:比较了3次,本轮排序结束后数组变成了{2,3,6,4,7},如下图:
以此类推...
3、代码实现
/**
* 选择排序
*
* @author 百里慕溪
*/
public static void selectSort(int[] array) {
// 一定要记住判断边界条件,很多人不注意这些细节
if (array == null || array.length < 2) {
return;
}
// 数组比较次数n-1
for (int i = 0; i < array.length - 1; i++) {
int min = i;// 保存当前最小元素的位置
// 遍历待排序数组元素(i之后的元素)
for (int j = i + 1; j < array.length; j++) {
// 如果已排序中较大元素大于待排序元素中的最小元素,则更换元素对应索引
if (array[min] > array[j]) {
min = j;
}
// 确保找出待排序的最小元素的编号
}
// 置换位置
int temp = array[min];
array[min] = array[i];
array[i] = temp;
}
}
运行结果:
三、两者区别
(1)冒泡排序是比较相邻位置的两个数,而选择排序是按顺序比较,找最大值或者最小值;
(2)冒泡排序每一轮比较后,位置不对都需要换位置,选择排序每一轮比较都只需要换一次位置;
(3)冒泡排序是通过数去找位置,选择排序是给定位置去找数;
冒泡排序优缺点:
优点:比较简单,空间复杂度较低,是稳定的;
缺点:时间复杂度太高,效率慢。
选择排序优缺点:
优点:一轮比较只需要换一次位置;
缺点:效率慢,不稳定。
JAVA基础篇专栏持续更新中,更多JAVA基础知识请移步专栏垂阅,希望对您有帮助!