标签:max 使用 排序 for 复杂 == 情况 细节 表达式
void Bubble_sort(int *t,int len) { for(int i=len-1;i>0;i--) { for(int j=0;j<i;j++) { if(t[j]<t[j+1]) swap(t[j],t[j+1]); } } }
void Selection_sorting(int *t,int len) { for(int i=0;i<len-1;i++) { int item=i; for(int j=i+1;j<len;j++) { item=t[item]<t[j]?item:j; } swap(t[i],t[item]); } }
void Insertion_sort(int *t,int len) { for(int i=1;i<len;i++) { for(int j=i;j>0;j--) { if(t[j]<t[j-1]) { swap(t[j],t[j-1]); } } } }
冒泡排序和选择排序,这两种排序不管你的数据状况是什么样的,时间复杂度都是O(n*n),但是插入排序的时间复杂度和数据本身的状况有关,但是我们在定义一个算法的时间复杂度往往是用最坏的情况去考虑,所以插入排序的时间复杂度也是O(n*n),但是我们要知道他和选择冒泡排序是有区别的。
例子:求一个数组的最大值
1 int get_max(int *t,int left,int right) 2 { 3 if(left==right) 4 { 5 return t[left]; 6 } 7 int mid = left+(right-left)/2;//这个可以防止溢出 8 int max1 = get_max(t,left,mid); 9 int max2 = get_max(t,mid+1,right); 10 if(max1>max2) return max1; 11 return max2; 12 }
这里这个递归算法的时间复杂度可以写成 T(N) = aT(N/b) + O(n^d),的形式,N代表数据的规模,a代表执行次数(在这个算法里面就是第八行和第九行代码),b的意思就是递归行为将原来的数据分成了多少份(在这里是两份),n^d代表的就是除了递归行为其他其他行代码的时间复杂度(在这里由于其他项代码的时间复杂度是一个常数项,所以d=0)
只要满足T(N) = a*T(N/b) + O(N^d)的形式,就可以使用master公式求解这个式子的时间复杂度。
标签:max 使用 排序 for 复杂 == 情况 细节 表达式
原文地址:https://www.cnblogs.com/luojianyi/p/9337570.html