冒泡排序法:
维基百科定义:冒泡排序(Bubble Sort,泡沫排序或气泡排序)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
冒泡排序对个项目需要O(
)的比较次数,且可以原地排序。尽管这个算法是最简单了解和实作的排序算法之一,但它对于少数元素之外的数列排序是很没有效率的。
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变量保存该次排序“最小值”在数组中的位置,直到本次结束时才将“最小值”交换到正确的位置。