冒泡排序+快速排序+选择排序(图解)

本文详细介绍了冒泡排序、快速排序和选择排序三种经典排序算法,通过图解和Java代码实现来阐述它们的原理。冒泡排序每次比较两个相邻元素并交换,快速排序采用基准数划分,选择排序则通过比较选取最小/大元素交换。快速排序在平均情况下具有较好的时间复杂度O(NlogN)。

冒泡排序

原理

假设有10个数,第一轮循环,第一个数和第二个数比较,如果第一个数大,第一个数和第二个数交换位置,否则不动;接着第二个数和第三个数比较,如果第二个数大,第二个数和第三个数交换位置,否则不动……第九个数和第十个数比较,如果第九个数大,第九个数和第十个数交换位置,否则不动。第一轮循环结束,最大的数挪到了第十个数的位置,比较进行了9次。 (注意:第一轮循环结束后,第十个数的位置已经固定,它是这些数里的最大值,不再需要比较)
第二轮循环,第一个数和第二个数比较,如果第一个数大,第一个数和第二个数交换位置,否则不动……第八个数和第九个数比较,如果第八个数大,第八个数和第九个数交换位置,否则不动。第二轮循环结束,第二大的数挪到了第九个数的位置,比较进行了8次。
……
第九轮循环,第一个数和第二个数比较,如果第一个数大,第一个数和第二个数交换位置,否则不动。第九轮循环结束,倒数第二大的数挪到了第二个数的位置,比较进行了1次。

即:每次比较两个相邻的元素,将较大的元素交换至右端。

图解
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Java实现

import java.util.Arrays;

public class BubbleSort {
   
   

	public static void main(String[] args) {
   
   
		int[] arr = {
   
   2,10,65,88,5,8,1};
		BubbleSort b = new BubbleSort();
		b.bubblesort(arr);
//		BubbleSort.bubblesort(arr);		//	bubblesort方法 加 static
		System.out.println(Arrays.toString(arr));
	}
	
	public void bubblesort(int[] arr){
   
   
		int temp;
		if(arr.length<=1){
   
   
			return;
		}
		//控制冒泡次数
		for(int i=0;i<arr.length-1;i++){
   
   
			//控制冒泡的比较次数
			//(可结合图理解 --冒泡次数每增加1,对应比较的次数相应减少1,体现在i上)
			for(int j=0;j<arr.length-1-i;j++){
   
   
				if(arr[j+1]<arr[j]){
   
   //相邻元素两两对比,如果是逆序的,则进行元素交换
					temp=arr[j+1];
					arr[j+1]=arr[j];
					arr[j]=temp;
				}
			}
		}
	}
}

注意:为什么 j < arr.length-1-i

第一轮循环: 每次比较两个相邻的元素,将较大的元素交换至右端。
第二轮循环:比较和上一轮几乎一样,只不过比较次数比第一次少1次 (因为最右端已经是最大数,无需再比较)
第三轮循环:比较和上一轮几乎一样,只不过比较次数比第二次少1次
……
综上,每增加一轮循环,我们的比较次数减1。
因此,我们要复用内循环,而循环的轮数由 i < arr.length - 1 决定,那么,我们要使它每轮循环后对于比较次数进行递减,则,可以再嵌套循环,将条件改为 j < arr.length-1-i ;i 从零递增,那么第一次,内循环执行了 arr.length - 1-0次;第二次,内循环执行了 arr.length - 1-1……第九次执行了arr.length-1-8次(arr.length=10)

运行结果

冒泡之前的数组:[2, 10, 65, 88, 5, 8, 1]
开始冒泡:[2, 10, 65, 88, 5, 8, 1]
开始冒泡:[2, 10, 65, 88, 5, 8, 1]
开始冒泡:[2, 10, 65, 88, 5, 8, 1]
开始冒泡:[2, 10, 65, 5, 88, 8, 1]
开始冒泡:[2, 10, 65, 5, 8, 88, 1]
开始冒泡:[2, 10, 65, 5, 8, 1, 88]
开始冒泡:[2, 10, 65, 5, 8, 1, 88]
开始冒泡:[2, 10, 65, 5, 8, 1, 88]
开始冒泡:[2, 10, 5, 65, 8, 1, 88]
开始冒泡:[2, 10, 5, 8, 65, 1, 88]
开始冒泡:[2, 10, 5, 8, 1, 65, 88]
开始冒泡:[2, 10, 5, 8, 1, 65, 88]
开始冒泡:[2, 5, 10, 8, 1, 65, 88]
开始冒泡:[2, 5, 8, 10, 1, 65, 88]
开始冒泡:[2, 5, 8, 1, 10, 65, 88]
开始冒泡:[2, 5, 8, 1, 10, 65, 88]
开始冒泡:[2, 5, 8, 1, 10, 65, 88]
开始冒泡:[2, 5, 1, 8, 10, 65, 88]
开始冒泡:[2, 5, 1, 8, 10, 65, 88]
开始冒泡:[2, 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值