时间复杂度

来源:互联网 发布:淘宝下架的宝贝在哪里找 编辑:程序博客网 时间:2024/06/14 07:44

什么是大O (Big O)
n表示数据规模
O(f(n))表示运算算法所需要执行的指令数

时间复杂度为常量级O(1)

void swapTwoInts(int &a, int&b){int temp=a;a=b;b=temp;}

时间复杂度为O(n)

int sum(int n){int ret=0;for(int i=0;i<=n;i++)ret+=i;return ret;}

时间复杂度为O(n^2)
选择排序

void selectionSort(int arr[],int n){ for(int i=0;i<n;i++){   int minIndex=i;   for(int j=i+1;j<n;j++)     if(arr[j]<arr[minIndex])     minindex=j;     swap(arr[i],arr[minIndex]);   }}}

一共要比较(n-1)+(n-2)+(n-3)+…+0
=(0+n-1)*n/2
=1/2*n^2 -1/2*n
=O(n^2)

时间复杂度为O(logn)
二分查找法

 int binarySearch(int arr[], int n, int target){    int l = 0, r = n-1;    while( l <= r ){        int mid = l + (r-l)/2;        if( arr[mid] == target ) return mid;        if( arr[mid] > target ) r = mid - 1;        else l = mid + 1;    }    return -1;}

算法规律:
在n个元素中查找
在n/2个元素中查找
在n/4个元素中查找
….
在1个元素中查找

实际上是说:n经过几次[除以2]的操作后,等于1?
经过log2(n)次。

归并排序O(NlogN)
核心思想:分治。
流程:先将一个序列分成很多个不能再分割的子序列,将各个子序列分别排序后再将子序列合并。
举例:5,2,6,7,9,1,3,8
分割:「5,2,6,7」「9,1,3,8」
分割第二次:「5,2」「6,7」「9,1」「3,8」
分割第三次:「5」「2」「6」「7」「9」「1」「3」「8」


合并:「2,5」「6,7」「1,9」「3,8」
合并第二次:「2,5,6,7」「1,3,8,9」
合并第三次:「1,2,3,5,6,7,8,9」


算法思路:
采用递归的方式

void mergesort(int a[], int first, int last, int temp[])  {      if (first < last)      {          int mid = (first + last) / 2;          mergesort(a, first, mid, temp);    //左边排序          mergesort(a, mid + 1, last, temp); //右边排序          mergearray(a, first, mid, last, temp); //再将二个有序数列合并      }  }  

对序列进行排序

void mergearray(int a[], int first, int mid, int last, int temp[])  {      int i = first, j = mid + 1;      int m = mid,   n = last;      int k = 0;      while (i <= m && j <= n)      {          if (a[i] <= a[j])              temp[k++] = a[i++];          else              temp[k++] = a[j++];      }      while (i <= m)  //如果左边的序列还有剩余,全部加入temp数组        temp[k++] = a[i++];      while (j <= n)  //如果右边的序列还有剩余,全部加入temp数组        temp[k++] = a[j++];  

整棵二叉树的深度为logN
每一层的排序是O(N)数量级的,
所以时间复杂度为O(NlogN)