冒泡排序法和选择排序法的排序过程

冒泡排序法:

维基百科定义:冒泡排序(Bubble Sort,泡沫排序或气泡排序)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

冒泡排序对n个项目需要O(n^2)的比较次数,且可以原地排序。尽管这个算法是最简单了解和实作的排序算法之一,但它对于少数元素之外的数列排序是很没有效率的。

java测试代码

public class ArraySort {
	public static void main(String[] args) {
		int[] dataArray = { 3, 0, 2, 7, 6, 10, 8, 1, 9, 4, 5 };

		System.out.println("这是原数组 ");
		for (int da : dataArray) {
			System.out.print(da + " ");
		}

		// 冒泡排序法
		int temp = 0;
		for (int i = 0; i != dataArray.length; ++i) {
			for (int j = i + 1; j != dataArray.length; ++j) {
				System.out.println("");
				for (int da : dataArray) {
					System.out.print(da + " ");
				}
				System.out.print("....." + dataArray[i] + " " + dataArray[j]);

				if (dataArray[i] > dataArray[j]) {
					temp = dataArray[i];
					dataArray[i] = dataArray[j];
					dataArray[j] = temp;
					System.out.print("   交换一次");
				}
			}
		}

		System.out.println("\n这是冒泡法");
		for (int da : dataArray) {
			System.out.print(da + " ");
		}
      }// end main
}// end class


测试结果如下所示:

这是原数组
3 0 2 7 6 10 8 1 9 4 5  
3 0 2 7 6 10 8 1 9 4 5 .....3 0     交换一次
0 3 2 7 6 10 8 1 9 4 5 .....0 2
0 3 2 7 6 10 8 1 9 4 5 .....0 7
0 3 2 7 6 10 8 1 9 4 5 .....0 6
0 3 2 7 6 10 8 1 9 4 5 .....0 10
0 3 2 7 6 10 8 1 9 4 5 .....0 8
0 3 2 7 6 10 8 1 9 4 5 .....0 1
0 3 2 7 6 10 8 1 9 4 5 .....0 9
0 3 2 7 6 10 8 1 9 4 5 .....0 4
0 3 2 7 6 10 8 1 9 4 5 .....0 5
0 3 2 7 6 10 8 1 9 4 5 .....3 2     交换一次
0 2 3 7 6 10 8 1 9 4 5 .....2 7
0 2 3 7 6 10 8 1 9 4 5 .....2 6
0 2 3 7 6 10 8 1 9 4 5 .....2 10
0 2 3 7 6 10 8 1 9 4 5 .....2 8
0 2 3 7 6 10 8 1 9 4 5 .....2 1     交换一次
0 1 3 7 6 10 8 2 9 4 5 .....1 9
0 1 3 7 6 10 8 2 9 4 5 .....1 4
0 1 3 7 6 10 8 2 9 4 5 .....1 5
0 1 3 7 6 10 8 2 9 4 5 .....3 7
0 1 3 7 6 10 8 2 9 4 5 .....3 6
0 1 3 7 6 10 8 2 9 4 5 .....3 10
0 1 3 7 6 10 8 2 9 4 5 .....3 8
0 1 3 7 6 10 8 2 9 4 5 .....3 2     交换一次
0 1 2 7 6 10 8 3 9 4 5 .....2 9
0 1 2 7 6 10 8 3 9 4 5 .....2 4
0 1 2 7 6 10 8 3 9 4 5 .....2 5
0 1 2 7 6 10 8 3 9 4 5 .....7 6     交换一次
0 1 2 6 7 10 8 3 9 4 5 .....6 10
0 1 2 6 7 10 8 3 9 4 5 .....6 8
0 1 2 6 7 10 8 3 9 4 5 .....6 3     交换一次
0 1 2 3 7 10 8 6 9 4 5 .....3 9
0 1 2 3 7 10 8 6 9 4 5 .....3 4
0 1 2 3 7 10 8 6 9 4 5 .....3 5
0 1 2 3 7 10 8 6 9 4 5 .....7 10
0 1 2 3 7 10 8 6 9 4 5 .....7 8
0 1 2 3 7 10 8 6 9 4 5 .....7 6     交换一次
0 1 2 3 6 10 8 7 9 4 5 .....6 9
0 1 2 3 6 10 8 7 9 4 5 .....6 4     交换一次
0 1 2 3 4 10 8 7 9 6 5 .....4 5
0 1 2 3 4 10 8 7 9 6 5 .....10 8   交换一次
0 1 2 3 4 8 10 7 9 6 5 .....8 7     交换一次
0 1 2 3 4 7 10 8 9 6 5 .....7 9
0 1 2 3 4 7 10 8 9 6 5 .....7 6     交换一次
0 1 2 3 4 6 10 8 9 7 5 .....6 5     交换一次
0 1 2 3 4 5 10 8 9 7 6 .....10 8   交换一次
0 1 2 3 4 5 8 10 9 7 6 .....8 9
0 1 2 3 4 5 8 10 9 7 6 .....8 7     交换一次
0 1 2 3 4 5 7 10 9 8 6 .....7 6     交换一次
0 1 2 3 4 5 6 10 9 8 7 .....10 9   交换一次
0 1 2 3 4 5 6 9 10 8 7 .....9 8     交换一次
0 1 2 3 4 5 6 8 10 9 7 .....8 7     交换一次
0 1 2 3 4 5 6 7 10 9 8 .....10 9   交换一次
0 1 2 3 4 5 6 7 9 10 8 .....9 8     交换一次
0 1 2 3 4 5 6 7 8 10 9 .....10 9   交换一次


选择排序法

维基百科定义:选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对n个元素的表进行排序总共进行至多n-1次交换。在所有的完全依靠交换去移动元素的排序方法中,选择排序属于非常好的一种。

JAVA测试代码

		// 选择排序法
		int temp = 0;
		for (int i = 0; i != dataArray.length - 1; ++i) {
			int indexMin = i;
			for (int j = i + 1; j != dataArray.length; ++j) {
				System.out.println("");
				for (int da : dataArray) {
					System.out.print(da + " ");
				}
				System.out.print("....." + dataArray[indexMin] + " "
						+ dataArray[j]);

				if (dataArray[j] < dataArray[indexMin]) {
					indexMin = j;
				}
			}
			if (i != indexMin) {
				temp = dataArray[i];
				dataArray[i] = dataArray[indexMin];
				dataArray[indexMin] = temp;
				System.out.print("   交换一次");
			}
		}

测试结果如下所示:

这是原数组
3 0 2 7 6 10 8 1 9 4 5
3 0 2 7 6 10 8 1 9 4 5 .....3 0
3 0 2 7 6 10 8 1 9 4 5 .....0 2
3 0 2 7 6 10 8 1 9 4 5 .....0 7
3 0 2 7 6 10 8 1 9 4 5 .....0 6
3 0 2 7 6 10 8 1 9 4 5 .....0 10
3 0 2 7 6 10 8 1 9 4 5 .....0 8
3 0 2 7 6 10 8 1 9 4 5 .....0 1
3 0 2 7 6 10 8 1 9 4 5 .....0 9
3 0 2 7 6 10 8 1 9 4 5 .....0 4
3 0 2 7 6 10 8 1 9 4 5 .....0 5     交换一次
0 3 2 7 6 10 8 1 9 4 5 .....3 2
0 3 2 7 6 10 8 1 9 4 5 .....2 7
0 3 2 7 6 10 8 1 9 4 5 .....2 6
0 3 2 7 6 10 8 1 9 4 5 .....2 10
0 3 2 7 6 10 8 1 9 4 5 .....2 8
0 3 2 7 6 10 8 1 9 4 5 .....2 1
0 3 2 7 6 10 8 1 9 4 5 .....1 9
0 3 2 7 6 10 8 1 9 4 5 .....1 4
0 3 2 7 6 10 8 1 9 4 5 .....1 5     交换一次
0 1 2 7 6 10 8 3 9 4 5 .....2 7
0 1 2 7 6 10 8 3 9 4 5 .....2 6
0 1 2 7 6 10 8 3 9 4 5 .....2 10
0 1 2 7 6 10 8 3 9 4 5 .....2 8
0 1 2 7 6 10 8 3 9 4 5 .....2 3
0 1 2 7 6 10 8 3 9 4 5 .....2 9
0 1 2 7 6 10 8 3 9 4 5 .....2 4
0 1 2 7 6 10 8 3 9 4 5 .....2 5
0 1 2 7 6 10 8 3 9 4 5 .....7 6
0 1 2 7 6 10 8 3 9 4 5 .....6 10
0 1 2 7 6 10 8 3 9 4 5 .....6 8
0 1 2 7 6 10 8 3 9 4 5 .....6 3
0 1 2 7 6 10 8 3 9 4 5 .....3 9
0 1 2 7 6 10 8 3 9 4 5 .....3 4
0 1 2 7 6 10 8 3 9 4 5 .....3 5     交换一次
0 1 2 3 6 10 8 7 9 4 5 .....6 10
0 1 2 3 6 10 8 7 9 4 5 .....6 8
0 1 2 3 6 10 8 7 9 4 5 .....6 7
0 1 2 3 6 10 8 7 9 4 5 .....6 9
0 1 2 3 6 10 8 7 9 4 5 .....6 4
0 1 2 3 6 10 8 7 9 4 5 .....4 5     交换一次
0 1 2 3 4 10 8 7 9 6 5 .....10 8
0 1 2 3 4 10 8 7 9 6 5 .....8 7
0 1 2 3 4 10 8 7 9 6 5 .....7 9
0 1 2 3 4 10 8 7 9 6 5 .....7 6
0 1 2 3 4 10 8 7 9 6 5 .....6 5     交换一次
0 1 2 3 4 5 8 7 9 6 10 .....8 7
0 1 2 3 4 5 8 7 9 6 10 .....7 9
0 1 2 3 4 5 8 7 9 6 10 .....7 6
0 1 2 3 4 5 8 7 9 6 10 .....6 10   交换一次
0 1 2 3 4 5 6 7 9 8 10 .....7 9
0 1 2 3 4 5 6 7 9 8 10 .....7 8
0 1 2 3 4 5 6 7 9 8 10 .....7 10
0 1 2 3 4 5 6 7 9 8 10 .....9 8
0 1 2 3 4 5 6 7 9 8 10 .....8 10   交换一次
0 1 2 3 4 5 6 7 8 9 10 .....9 10


:从以上测试可以看出,在排序过程中,冒泡法一旦发现某两数顺序不对则立即对直接进行位置交换,选择排序法则每次通过一个indexMin变量保存该次排序“最小值”在数组中的位置,直到本次结束时才将“最小值”交换到正确的位置。





你可能感兴趣的:(JAVA)