1.1 冒泡排序原理
举个例子
利用冒泡排序对下面 n 个元素按照从大到小的顺序进行排序: (1,5,3,9,12,7,15,10)
动画演示
对于例中的 n 个元素的排序过程如下:
Tip: 相邻元素比较次数为 n-1 次
Java语言实现
public class Sort {
public static void bubbleSort(int[] arr) {
for(int i = 0; i < arr.length; i++) {
boolean flag = false;
for(int j = 0; j < arr.length-1; j++) {
if(arr[j] < arr[j+1]) {
int t = arr[j];
arr[j] = arr[j+1];
arr[j+1] = t;
flag = true;
}
}
if(flag == false){
break;
}
}
}
}
Tip: 这里使用 flag 来处理已经排序好的情况
测试结果
public class Test {
public static void main(String[] args) {
int[] arr = new int[]{1,5,3,9,12,7,15,10};
Sort.bubbleSort(arr);
for(int a: arr) {
System.out.println(a);
}
}
}/*output:
[15, 12, 10, 9, 7, 5, 3, 1]
*/
时间复杂度分析
最好的情况下:元素已经按照大小顺序排序,只需要比较 n-1 次,时间复杂度为 O(n)
最坏的情况下:元素按照倒序排序,需要执行 n (n - 1) 次比较,时间复杂度为O( n2 )
1.2 选择排序原理
在未排序的序列中找到最大(最小值)依次有序放入排序好的序列中。
举个例子
利用选择排序对下面 n 个元素按照从大到小的顺序进行排序: (1, 5, 3, 9, 12, 7, 15, 10)
动画演示
Java语言实现
public class Sort {
public static void selectSort(int[] arr) {
int maxId;
for(int i = 0; i < arr.length; i++) {
maxId = i;
for(int j = i+1; j < arr.length; j++) {
if(arr[j] > arr[maxId]) {
maxId = j;
}
}
int t = arr[i];
arr[i] = arr[maxId];
arr[maxId] = t;
}
}
}
测试结果
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
int[] arr = new int[] {1, 5, 3, 9, 12, 7, 15, 10};
Sort.selectSort(arr);
System.out.println(Arrays.toString(arr));
}
}/*output:
[15, 12, 10, 9, 7, 5, 3, 1]
*/
时间复杂度分析
选择排序无论是哪个元素进去,都要进行两次循环操作,所以时间复杂度为 O(n2)