排序算法总结:冒泡排序
来源:静默虚空
www.cnblogs.com/jingmoxukong/p/4302718.html
public void bubbleSort(int[] list) {
int temp = 0; // 用来交换的临时数
// 要遍历的次数
for (int i = 0; i < list.length - 1; i++) {
// 从后向前依次的比较相邻两个数的大小,遍历一次后,把数组中第i小的数放在第i个位置上
for (int j = list.length - 1; j > i; j--) {
// 比较相邻的元素,如果前面的数大于后面的数,则交换
if (list[j - 1] > list[j]) {
temp = list[j - 1];
list[j - 1] = list[j];
list[j] = temp;
}
}
System.out.format("第 %d 趟: ", i);
printAll(list);
}
}
Mmax = 3N(N-1)/2 = O(N2)
冒泡排序的最坏时间复杂度为O(N2)。
因此,冒泡排序的平均时间复杂度为O(N2)。
// 对 bubbleSort 的优化算法
public void bubbleSort_2(int[] list) {
int temp = 0; // 用来交换的临时数
boolean bChange = false; // 交换标志
// 要遍历的次数
for (int i = 0; i < list.length - 1; i++) {
bChange = false;
// 从后向前依次的比较相邻两个数的大小,遍历一次后,把数组中第i小的数放在第i个位置上
for (int j = list.length - 1; j > i; j--) {
// 比较相邻的元素,如果前面的数大于后面的数,则交换
if (list[j - 1] > list[j]) {
temp = list[j - 1];
list[j - 1] = list[j];
list[j] = temp;
bChange = true;
}
}
// 如果标志为false,说明本轮遍历没有交换,已经是有序数列,可以结束排序
if (false == bChange)
break;
System.out.format("第 %d 趟: ", i);
printAll(list);
}
}
1 package notes.javase.algorithm.sort;
2
3 import java.util.Random;
4
5 public class BubbleSort {
6
7 public void bubbleSort(int[] list) {
8 int temp = 0; // 用来交换的临时数
9
10 // 要遍历的次数
11 for (int i = 0; i < list.length - 1; i++) {
12 // 从后向前依次的比较相邻两个数的大小,遍历一次后,把数组中第i小的数放在第i个位置上
13 for (int j = list.length - 1; j > i; j--) {
14 // 比较相邻的元素,如果前面的数大于后面的数,则交换
15 if (list[j - 1] > list[j]) {
16 temp = list[j - 1];
17 list[j - 1] = list[j];
18 list[j] = temp;
19 }
20 }
21
22 System.out.format("第 %d 趟: ", i);
23 printAll(list);
24 }
25 }
26
27 // 对 bubbleSort 的优化算法
28 public void bubbleSort_2(int[] list) {
29 int temp = 0; // 用来交换的临时数
30 boolean bChange = false; // 交换标志
31
32 // 要遍历的次数
33 for (int i = 0; i < list.length - 1; i++) {
34 bChange = false;
35 // 从后向前依次的比较相邻两个数的大小,遍历一次后,把数组中第i小的数放在第i个位置上
36 for (int j = list.length - 1; j > i; j--) {
37 // 比较相邻的元素,如果前面的数大于后面的数,则交换
38 if (list[j - 1] > list[j]) {
39 temp = list[j - 1];
40 list[j - 1] = list[j];
41 list[j] = temp;
42 bChange = true;
43 }
44 }
45
46 // 如果标志为false,说明本轮遍历没有交换,已经是有序数列,可以结束排序
47 if (false == bChange)
48 break;
49
50 System.out.format("第 %d 趟: ", i);
51 printAll(list);
52 }
53 }
54
55 // 打印完整序列
56 public void printAll(int[] list) {
57 for (int value : list) {
58 System.out.print(value + " ");
59 }
60 System.out.println();
61 }
62
63 public static void main(String[] args) {
64 // 初始化一个随机序列
65 final int MAX_SIZE = 10;
66 int[] array = new int[MAX_SIZE];
67 Random random = new Random();
68 for (int i = 0; i < MAX_SIZE; i++) {
69 array[i] = random.nextInt(MAX_SIZE);
70 }
71
72 // 调用冒泡排序方法
73 BubbleSort bubble = new BubbleSort();
74 System.out.print("排序前: ");
75 bubble.printAll(array);
76 // bubble.bubbleSort(array);
77 bubble.bubbleSort_2(array);
78 System.out.print("排序后: ");
79 bubble.printAll(array);
80 }
81 }
排序前: 2 9 9 7 1 9 0 2 6 8
第 0 趟: 0 2 9 9 7 1 9 2 6 8
第 1 趟: 0 1 2 9 9 7 2 9 6 8
第 2 趟: 0 1 2 2 9 9 7 6 9 8
第 3 趟: 0 1 2 2 6 9 9 7 8 9
第 4 趟: 0 1 2 2 6 7 9 9 8 9
第 5 趟: 0 1 2 2 6 7 8 9 9 9
排序后: 0 1 2 2 6 7 8 9 9 9