Ghero 2020-05-03

一、前言
排序算法的评价指标:
2.算法的内存消耗
3.算法的稳定性
二、时间复杂度为O(n2)的排序算法
//排序方法
public static void bubbleSort(int[] arr){
//首先判断数组的大小
if (arr.length <= 1){
return;
}
for (int i = 0; i < arr.length - 1; i++) {//冒泡的趟数for (int j = 0; j < arr.length - 1 - i; j++) {//交换次数
if (arr[j] > arr[j + 1]){
int temp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = temp;
}
}
}
}重点:冒泡的次数i为:数组的长度n - 1;每次冒泡的比较次数j = n - i - 1代码优化:
//优化的排序方法
public static void bubbleSort(int[] arr){
//首先判断数组的大小
if (arr.length <= 1){
return;
}
for (int i = 0; i < arr.length - 1; i++) {//冒泡的趟数
boolean flag = false;//添加标志位,用于判断是否发生数据交换;若某一趟没有发生交换,说明后续数组已经有序,可以不用进行比较
for (int j = 0; j < arr.length - 1 - i; j++) {//交换次数
if (arr[j] > arr[j + 1]){
temp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = temp; flag = true;
}
} if(!flag){ break; }
}
}3.算法指标:
public static void insertionSort(int[] arr){//默认从小到大,尾部比较法
for (int i = 1; i < arr.length; i++) {//此时i代表的是未排序区间中要参与插入的元素以及其位置
int value = arr[i];
int j = i - 1;
for (; j >= 0 ; j--) {//从尾部开始比较,j代表已排序区间的元素个数
if (arr[j] > value){
arr[j + 1] = arr[j];
}else{
break;
}
}
arr[j + 1] = value;
}
}
//默认从大到小,头部插入法for (int i = 1; i < arr.length; i++) { for (int j = 0; j < i ; j++) { if (arr[j] < arr[i]){ int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } }}注意:若从小到大排序,则选择尾部插入法;从大到小排序,则选择头部插入法public static void sectionSort(int[] arr){默认从小到大
for (int i = 0; i < arr.length - 1; i++) {//比较后元素要插入的位置
int min = arr[i];
int minIndex = i;//用于存放最小值的坐标
for (int j = i + 1; j < arr.length; j++) {//比较区间中最小的元素
if (min > arr[j]){
min = arr[j];
minIndex = j;
}
}
if (minIndex != i){
arr[minIndex] = arr[i];
arr[i] = min;
}
}
}要知道时间复杂度只是描述一个增长趋势,复杂度为O的排序算法执行时间不一定比复杂度为O长,因为在计算O时省略了系数、常数、低阶。实际上,在对小规模数据进行排序时,n2的值实际比 knlogn+c还要小。