跟左神学算法_1

内容:

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、递归

猜你喜欢

转载自www.cnblogs.com/wyb666/p/10106010.html