10大排序算法——01冒泡排序(Java实现)

冒泡排序(Bubble Sort)

冒泡排序也叫起泡排序

冒泡排序的执行流程

1.从头开始比较每一对相邻元素,如果第一个比第二个大,就交换他们的位置。(执行完第一轮,最后的那个元素就是最大的元素)

2.忽略从步骤1中找到的那个最大元素,然后重复执行步骤1,直到元素有序

来看代码:

	public int[] bubbleSort(int[] array ){
		for (int end = array.length; end > 0; end--) {
			for (int begin = 1 ; begin<end ; begin++) {
				if(array[begin]<array[begin-1]) {
					int index = array[begin];
					array[begin]=array[begin-1];
					array[begin-1] = index;
				}
			}
		}
		return array;
	}

调用一下试试

	public static void main(String[] args) {
		BubbleSort b = new BubbleSort();
		int[] array = {9,8,7,4,5,6,1,2,3};
		System.out.println("排序前");
		for (int i = 0; i < array.length; i++) {
			if(i!=0) System.out.print(" ");
			System.out.print(array[i]);
		}
		
		b.bubbleSort(array);
		
		System.out.println("\n排序后");
		for (int i = 0; i < array.length; i++) {
			if(i!=0) System.out.print(" ");
			System.out.print(array[i]);
		}
	}
运行结果:
     排序前
     9 8 7 4 5 6 1 2 3
     排序后
     1 2 3 4 5 6 7 8 9

这是冒泡排序的最简单的形式,下面我们来给他优化一下。

优化冒泡排序1

优化方案: 如果序列已经完全有序,可以提前终止排序

来看代码:

	public int[] bubbleSort(int[] array ){
		for (int end = array.length; end > 0; end--) {
			
			boolean b = true;
			
			for (int begin = 1 ; begin<end ; begin++) {
				if(array[begin]<array[begin-1]) {
					
					int index = array[begin];
					array[begin]=array[begin-1];
					array[begin-1] = index;
					
					b = false;
				}
				if (b) break;
			}
		}
		return array;
	}

优化代码和未优化的代码的区别就是,优化代码添加了一个boolean类型,用来判断如果在for循环一圈后,都没有触动if语句,说明这个数组已经不需要排序了。然后直接结束排序。

当然这个排序还是可以有另外一种优化方式

优化冒泡排序2

优化方案: 如果序列已经局部有序,可以记录最后一次交换的位置,减少交换次数。

来看代码:

	public int[] bubbleSort(int[] array ){
		for (int end = array.length; end > 0; end--) {
			int j = 1;
			for (int begin = 1 ; begin<end ; begin++) {
				if(array[begin]<array[begin-1]) {
					int index = array[begin];
					array[begin]=array[begin-1];
					array[begin-1] = index;
					
					j = begin;
					
				}
				end = j;
			}
		}
		return array;
	}

优化代码和未优化的代码的区别就是,优化代码添加了一个int类型,用来判记录最后交换的位置,然后直接可以让索引指向这个位置,下一次在进行循环可以直接从这个位置作为应该索引,这个位置后面的元素就可以不去遍历。

冒泡排序属于稳定排序,为原地算法

注:本文博主学习自腾讯课堂的小码哥的“数据结构与算法”,所以如有和小码哥课程中类似方案,纯属必然!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章