文章目录
一、选择排序,冒泡排序,插入排序时间复杂度细节的讲解与复杂度分析
估计常数操作的指标
1.1常数操作
例如
- 数组的直接取用,所做的操作其实只是做一个偏移量,它就是一个常熟操作
- 链表得到i位置的值list.get(i),从左往右遍历找到该位置,则不是常数操作
- 同样的还有:加减乘除,位运算
总结:只要与数据量无关,就是常熟操作,与数据量有关的就不是常数操作。
1.2选择排序
1.2.1算法思路
取一个数组,遍历一遍,找出最小(最大值)讲这个数和第一位进行交换,这样第一位就是最大(小)的了。接着对剩下的遍历找到最值与第二位交换这样不断重复就可以找到最小值了1.2.2时间复杂度的分析
1.数组索引第一次N,第二次N-1,第三题N-2等等(N+N-1+N-2+……+1)=O(N^2) 2.比较同数组索引O(N^2) 3.交换共N次 所以常数操作可以表示为aN^2+bN+c 忽略最次数小的项(应为当数据量达到一定程度的时候其影响微乎其微) 则为O(N^2)1.2.3代码实现
public class SelectionSort {
public static void selectionsort(int [] arr) {
if( arr == null && arr.length < 2 ) {
return;
}
int l = arr.length;
for(int i = 0; i < l; i++ ) {
int min = i ;
for( int j = i+1 ; j < l; j++ ) {
min = arr[min] < arr[j] ? min : j;
}
swap(arr, i, min);
}
}
public static void swap(int [] arr, int i , int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
当BIG O()相等时
我们必须实际去跑,去允许去测试。应为对与常数的数量与时间并不是完全成正比,因为没一个常数操作的时间不一样。例如位运算与加减乘除运算的时间效率完全不一样
1.3冒泡排序
1.3.1算法思路
取一个数组交换与比较穿插进行,遍历一遍,比较相邻两个数,然后判断是否需要交换,最后确定一个数的位置。然后遍历N遍即可排序完1.3.2时间复杂度分析
1.显然查找O(N^2)次 2.交换也是O(N^2)次 3.即时间复杂度位O(N^2)1.3.3代码的实现
代码如下
public class BubbleSort {
public static void bubblesort(int[] arr) {
if(arr == null || arr.length < 2) {
return ;
}
for (int e = arr.length -1 ; e > 0 ; e-- ) {
for(int i = 0 ; i < e ; i ++ ){
if(arr[i]>arr[i+1]) {
swap(arr, i ,i+1);
}
}
}
}
public static void swap (int [] arr, int i , int j) {
arr[i]=arr[i]^arr[j];
arr[j]=arr[i]^arr[j];
arr[i]=arr[i]^arr[j];
}
}
1.插入排序
将数组分成两部分,一部分已经排好序,另一部分没排好序。不断的从没排好序的集合中选一个出来放到已排好序的数组中。然后不断的交换值。
2.代码
public class insertionSort {
public static void insertionSort(int [] arr) {
if(arr == null || arr.length < 2) {
return ;
}
for(int i = 1 ; i < arr.length ; i++) {
for(int j = i - 1; j >= 0 && arr[j] > arr[j +1]; --j ) {
swap(arr , j , j+1);
}
}
}
public static void swap(int [] arr , int i , int j ) {
arr[i]=arr[i]^arr[j];
arr[j]=arr[i]^arr[j];
arr[i]=arr[i]^arr[j];
}
}
3.时间复杂度
显然从一个集合中取需要N次,然后在另一个集合中交换需要N次。所以时间复杂度为BIG O (N^2)
但是那个只是最差情况,其实最好情况是BIG O(N)
但是这个数值对于算法学习没有用,所以一般不用
还有两个不常用的符号
一个平均时间复杂程度
一个是最简时间复杂程度
只不过对于算法学习没有用就不做多说