排序04冒泡排序

一)定义

将被排序的记录数组R[1..n]垂直排列,每个记录R[i]看作是重量为R[i].key的气泡。根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R:凡扫描到违反本原则的轻气泡,就使其向上"飘浮"。如此反复进行,直到最后任何两个气泡都是轻者在上,重者在下为止。

冒泡排序属于交换排序,交换排序主要是根据记录的关键字的大小,将记录交换来进行排序的。交换排序的特点是:将关键字值较大的记录向序列的后部移动,关键字较小的记录向前移动。交换排序方法包括冒泡排序和快速排序。

二)冒泡排序的实现(java)

package com.fox;

import java.util.Random;

public class BubbleSort {

	public static void sort(int[] a) {
		for (int i = 0; i < a.length - 1; i++) {
			for (int j = 0; j < a.length - 1 - i; j++) {
				if (a[j] > a[j + 1]) {
					int temp = a[j];
					a[j] = a[j + 1];
					a[j + 1] = temp;
				}
			}
		}
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		int[] a = new int[100000];
		Random random = new Random();
		for (int i = 0; i < a.length; i++) {
			a[i] = random.nextInt(100000);
		}
		// a = new int[] { 6, 7, 51, 2, 52, 8 };
		long bt = System.currentTimeMillis();
		BubbleSort.sort(a);
		System.out.println(System.currentTimeMillis() - bt);
		// for (int a_ : a)
		// System.out.println(a_);

	}

}

  

该算法的时间复杂度为O(n2)。上面的算法还可以做出一定优化,就是第二层循环内如果没有进行交换,则说明已经全部有序,可以直接退出。

public static void sort(int[] a) {
		for (int i = 0; i < a.length - 1; i++) {
			int flag = 0;
			for (int j = 0; j < a.length - 1 - i; j++) {
				if (a[j] > a[j + 1]) {
					int temp = a[j];
					a[j] = a[j + 1];
					a[j + 1] = temp;
					flag++;
				}
			}
			if (flag == 0)
				break;
		}
	}

在极端情况下,待排序数组本来就有序(升序),那么改进后的算法时间复杂度为O(n)。

原文地址:https://www.cnblogs.com/huangfox/p/2569292.html