一,选择排序和冒泡排序的本质区别
选择排序和冒泡排序是两个非常相似的算法:
1,时间复杂度都是O(n²);
2,写法是都是两层for循环;
3,每一轮循环都是按照排序需求把最大的或者最小的元素找出来;
区别在于:
1,冒泡排序是从开始位置进行遍历,在结束位置有序;
2,选择排序从开始位置进行遍历,在开始位置有序;
3,冒泡排序是相邻两个位置的元素比较,交换;
4,选择排序是一个固定位置的元素与其他所有元素比较;
冒泡排序:
选择排序:
public static void main(String[] args) {
bubbleSort(new int[]{1,4,3,7,5});
}
// 选择排序算法
private static void selectSort(int[] arr) {
for (int i = 0; i < arr.length-1; i++) {
for (int j = i+1; j < arr.length; j++) {
if (arr[j] < arr[i]) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
// 带优化的冒泡排序,如果在一轮循环中,一次交换都没有发生,说明这个数组已经有序了
private static void bubbleSort(int[] arr) {
boolean switched = true;
for (int i = 0; i < arr.length -1 && switched ; i++) {
switched = false;
for (int j = 0; j< arr.length-i-1; j++) {
if ( arr[j] < arr[j+1]) {
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
switched = true;
}
}
}
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
二,为什么生产选择插入排序而非冒泡排序?
插入排序的代码:
private static void insertSort(int[] arr) {
for (int i = 1; i < arr.length; i++) {
int temp = arr[i];
int j = i-1;
for (; j>=0; j--) {
if (arr[i] < arr[j]) {
arr[i] = arr[j];
} else {
break;
}
}
arr[j+1] = temp;
}
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
虽然算法时间复杂度都是O(n²),但插入算法只有比较和移动,而冒泡除了比较外还有交换,比插入排序多两次运算,数据量大的情况下,效率还是有很大区别。