内容:
1、时间复杂度
2、简单排序
3、对数器使用
4、递归
注:实现代码为Java
1、时间复杂度
什么是常数时间的复杂度:一个操作如果跟数据量没有关系,每次都是固定时间内完成的操作就叫常数操作
关于时间复杂度:
时间复杂度为一个算法流程中常数操作数量的指标(一般是最差情况下),常用O(读作big O)来表示
具体来说在常数操作数量的表达式中,只要高阶项,不要低阶项,也不要高阶项的系数
然后把剩下的部分记为f(N),那么时间复杂度为O(f(N))
如何平均一个算法好坏:
评价一个算法的好坏,先看时间复杂度的指标,
然后再分析不同数据样本下的实际运行时间,也就是常数项时间
2、简单排序
简单排序是指:冒泡排序、选择排序、插入排序
时间复杂度及空间复杂度:
- 冒泡排序: 时间复杂度: 严格O(N^2) 额外空间复杂度: O(1)
- 选择排序: 时间复杂度: 严格O(N^2) 额外空间复杂度: O(1)
- 插入排序: 时间复杂度: O(N^2) 额外空间复杂度: O(1)
- 注: 插入排序的真正时间复杂度和数组状态有关,如果数组有序则时间复杂度为O(N)
代码:
1 // 后面都要用到的swap代码: 2 public static void swap(int[] arr, int i, int j){ 3 int temp = arr[i]; 4 arr[i] = arr[j]; 5 arr[j] = temp; 6 } 7 8 // 冒泡排序 9 public static void bubbleSort(int[] arr){ 10 if(arr==null || arr.length<2){ 11 return; 12 } 13 for(int end=arr.length-1; end>=0; end--){ 14 for(int i=0; i<end; i++){ 15 if(arr[i] > arr[i+1]){ 16 swap(arr, i, i+1); 17 } 18 } 19 } 20 } 21 22 // 选择排序 23 public static void selectionSort(int[] arr){ 24 if(arr==null || arr.length<2){ 25 return; 26 } 27 for(int i=0; i<arr.length-1; i++){ 28 int minIndex = i; 29 for(int j=i+1; j<arr.length; j++){ 30 minIndex = arr[j] < arr[minIndex] ? j : minIndex; 31 } 32 swap(arr, i, minIndex); 33 } 34 } 35 36 // 插入排序 37 public static void insertionSort(int[] arr) { 38 if (arr == null || arr.length < 2) { 39 return; 40 } 41 for (int i = 1; i < arr.length; i++) { 42 for (int j = i - 1; j >= 0 && arr[j] > arr[j + 1]; j--) { 43 swap(arr, j, j+1); 44 } 45 46 } 47 }
3、对数器使用
4、递归