交换排序——冒泡排序

    冒泡排序是一种广为人知的排序算法,因为它相对于前面介绍的选择排序来说效率有所提升,而且实现简单。最好情况下只需要1次比较,最差需要(n-1)次比较。

    实现思路就是不停的使数组中相邻的左右两个元素对比大小,将大的元素往右挪。因为是左右互换,所以每轮比较下来后方的元素均以排序,所以可以提供了可以提前结束排序的机会。


    

package com.h3c.paixu;

public class 冒泡排序Demo {
	static boolean changeFlag = false;

	public static void main(String[] args) {
		// 1. 初始化一个无序数组
		int[] myArr = { 23, 35, 73, 27, 4, 77, 54, 84, 47, 56, 34, 32, 75, 32,
				31, 0, 99, 7, 54, 57 };

		for (int k = myArr.length; k > 0; k--) {
			changeFlag = false;
			myArr = 冒泡排序(k, myArr);
			
			if (!changeFlag) {// 如果没有挪位,证明已经排序完成
				return;
			}

			for (int i : myArr) {
				System.out.print(i + " ");
			}

			System.out.println("");
		}
	}

	private static int[] 冒泡排序(int endIndex, int[] myArr) {
		int tempValue = 0;

		for (int n = 0; n < endIndex; n++) {
			if ((n + 1) < myArr.length && myArr[n] > myArr[n + 1]) {
				tempValue = myArr[n];
				myArr[n] = myArr[n + 1];
				myArr[n + 1] = tempValue;
				changeFlag = true;
			}
		}
		return myArr;
	}
}
    冒泡排序时间效率是不确定的,空间效率是O(1),并且冒泡排序是稳定排序。这里科普一下什么叫稳定排序:

假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri=rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的;否则称为不稳定的。
    说白了,就是数组中有俩相同的元素,如果俩元素位置在排序后有变化就是不稳定排序,如果没变化就是稳定排序。如

    5   3    6    2   3*    7

   稳定排序:2   3   3*   5   6   7

   不稳定排序:2   3*   3   5   6   7

你可能感兴趣的:(算法)