我们将讨论一系列排序算法。
第一个算法是冒泡排序。冒泡,顾名思义就是将轻的气体从水中浮出,反过来就是沉底。而冒泡排序的思想就是每次从当前序列中两两元素比较并且必要时交互两个元素的位置来实现将当前序列中最大或最小的元素“浮”到序列末端。
wikipeda上的gif图:
假如我们要排序的整数序列为:
一开始我们比较该序列的前两个元素,假如我们是按升序排列:
我们发现56>25,我们就交互这两个元素:
交换完之后就继续比较56和37,我们发现56>37,那么继续交互这两个元素并且继续向前比较。
第一轮比较后,序列变为:
我们发现最大的元素95已经漂浮到序列尾部了,它就不需参加下一轮排序了。
下一轮继续从序列开头开始,比较25和37,它们符合小数在前,大数在后,故不需要比较。继续比较37和56......
第二轮排序结果为:
我们看到第二大的73排到了序列倒数第二的位置,下一轮参加的将是25~30这六个数。
将这个过程继续下去,N-1(本例子为N为8)轮排序后就可将序列拍好序。
Java实现的代码:
public class BubbleSort {
public static void bubSort(int[] a) {
int temp;
for (int i = a.length - 1; i > 0; i--){
for (int j = 0; j < i; j++){
if (a[j] > a[j + 1]) {
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
}
public static void main(String[] args) {
int[] a = {56, 25, 37, 58, 95, 19, 73, 30};
bubSort(a);
for (int i : a)
System.out.printf("%-5d", i);
}
}
改进策略:设置bool值isSorted,如果数组本身有序,就不用比较那么多次了,直接结束循环:
public class BubbleSort {
public static void bubbeSort(int[] arr) {
int length = arr.length;
boolean isSorted = false;
while (!isSorted && length != 0) {
isSorted = true;
for (int i = 0; i < length - 1; i++) {
if (arr[i] > arr[i + 1]) {
isSorted = false;
int temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}
length--;
}
}
public static void main(String[] args) {
int[] arr = {1, 3, 5, 1, 66, -1};
bubbeSort(arr);
for (int a : arr)
System.out.print(a + " ");
System.out.println();
}
}
算法核心部分用到了双重循环,执行最里层循环代码的次数为0+1+2+*+N - 1 = ((N - 1) * N) / 2择排序的时间复杂度为O(N^2);