从零开始理解冒泡排序

冒泡排序是一种基础的入门级别的算法,它的效率比较低,但是理解它的好处是让我们对算法有初步的了解,理解了冒泡排序,不仅仅是让我们写出一个简单算法,完成入门,笔者认为写出一段程序除了能够给我们带来收入以外,如果你能从写的代码中感受到一丝快乐,这是一种精神享受。下面就让我们开始理解冒泡排序算法,然后尝试着自己去把它写出来。哪怕过了两年之后,你仍然能手到拿来,不用过多思考,那么就算是真正掌握了。

首先,冒泡排序的核心思想是:两层比较

什么是两层比较呢?假设我现在有一个数组

int[] arr = { 56, 39, 85, 66, 34 };

这个数组显然是杂乱无章的,我们不管是要将它升序排列还是降序排列,其目的都是让它成为有序的数组。

那么,第一层比较,首先需要确定的就是,要想让这个数组有序,我需要比较几轮(注意不是比较几次)

冒泡排序的思想是:

每经过一轮比较,我们都要确定一个最值(有可能是最大值,也有可能是最小值),对于上面的数组,我们经过第一轮比较可以确定85是最大的,但是其它元素我们仍不能确定其大小关系。

然后,在下一轮比较时,前面几轮的已经确定的最值就不用参与比较了,只需要比较剩余的元素即可,在上面的数组中,第二轮比较,显然不用考虑85了,它已经在第一轮确定为所有数字中最大的一个数字,那么,我们只需要在56,39,66,34这四个数字中再确定一个最大值,显然这个值是66.

接着是第三轮比较,此时85和66的位置已经确定了,我们只需要在56,39,34这三个数字中确定一个最大值,显然,这个值是56,

然后是第四轮比较,此时85,66,56的位置已经确定了,我们只需要在39和34中间选一个最大值,显然这个值是39.

由于85,66,56,39的位置已经确定,所以最后一个值34的位置也自动确定了(因为只有5个元素,已经占据了四个位置,那么剩下的元素只有一个位置可以选择)。

一句话总结第一层比较:对于有n个元素的数组,我需要确定n-1个元素的位置,剩下的一个位置自动确定。也就是我们需要进行n-1轮比较,比较的目的是,每一轮产生一个最值。

接下来是第二层比较:即每一轮的比较中,我们需要进行几次比较(注意,这里是几次,而不是几轮)

很显然,三个数字,为了确定一个最值,我们需要比较2次,n个数字,我们需要比较n-1次。

根据冒泡排序的特点,每一轮参与比较的元素个数,都会比上一轮少一个,所以,我们每一轮需要进行比较的次数也是递减的,这个规律是:同样的,每一轮的比较次数,会比上一轮少一次(因为元素个数少了一个)

做了上面这些准备工作以后,可以写出冒泡排序的代码了(未经优化)

package com.neusoft.baoly;

public class BubbleSort {
	public static void main(String[] args) {
		int[]arr = {6,5,4,3,2,1};
		mySort(arr);
	}
	/*
	 *首先确定冒泡排序算法一共需要比几轮
	 *它的思想是每一轮确定一个最大或者最小值
	 *这样需要比较arr.length-1轮,因为当前面所有数字的顺序都确定以后
	 *最后一个数字是不需要排序的
	 *
	 *其次需要确定的是每一轮比较几次
	 *第一轮还没有确定最值,也就是说6个数字需要比较5次 5个数字需要比较四次
	 *第二轮开始之前,已经确定一个最值了,如果一共有六个数字那么第二轮开始时只有5个数字的序列
	 *则第二轮只需要比较四次,第三轮三次,第四轮两次,第五轮一次,由此确定代码
	 *
	 */
	public static void mySort(int []arr){
		for(int i=0;i<arr.length-1;i++){
			for(int j=0;j<arr.length-i-1;j++){
				if(arr[j]>arr[j+1]){
					int temp=arr[j];
					arr[j]=arr[j+1];
					arr[j+1]=temp;
				}
			}
		}
		for (int k = 0; k < arr.length; k++) {
			System.out.print(arr[k]+"\t");
		}
	}
}

希望大家能感受到编程的乐趣,获得成就感 ^-^

转载请注明出处

猜你喜欢

转载自blog.csdn.net/es_baoly/article/details/81592076