JAVA基础篇004-冒泡排序和选择排序的原理图解、代码实现、以及两者区别详解

目录

一、冒泡排序:

1、排序原理

2、原理图

3、代码实现

二、选择排序

1、排序原理

2、原理图

3、代码实现

三、两者区别


很多小伙伴对冒泡排序和选择排序傻傻分不清楚,今天我把这两个排序放在一起,希望能帮助大家更好的理解它们!

扫描二维码关注公众号,回复: 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基础知识请移步专栏垂阅,希望对您有帮助!

原创文章 15 获赞 20 访问量 7395

猜你喜欢

转载自blog.csdn.net/duoyu779553/article/details/105834649