类快排的时间复杂度问题

来源:互联网 发布:电影机智问答知乎 编辑:程序博客网 时间:2024/06/01 07:21
void swap(int* a,int* b){    *a = *a ^ *b;    //a、b中不同位    *b = *a ^ *b;    //b = a    *a = *a ^ *b;    //a = b}void ArrangArray(int* StartPos,int* EndPos){    //Step1先将小于零的放在最左边,大于等于0的数不区分,都放在右边    int* low = StartPos;    int* high = EndPos;    while(low < high)    {        while( *low < 0 && low < high ) low++;        while( *high >= 0 && low < high ) high--;        if(low < high)            swap(low,high);    }//由于里面循环和外面都是对low和high的判断,我个人认为是    n    //循环结束时,low一定等于high,且指向大于等于0的数       //    high = EndPos;    while(low < high)    {        while( *low == 0 && low < high ) low++;        while( *high > 0 && low < high ) high--;        if(low < high)            swap(low,high);    }//同理这里也是n}int main(){    int array[10] = {-1,3,0,2,-5,0,-3,4,0,-8};    ArrangArray(array,array + 9);}
先看这个的复杂度 。个人认为是O(n),如果不是,请指教。快排的三个步骤1 找到序列中用于划分序列的元素2. 用元素划分序列3. 对划分后的两个序列重复1,2两个步骤指导序列无法再划分T(n) = 2*T(n/2) + n (表示将长度为n的序列划分为两个子序列,每个子序列需要T(n/2)                         的时间,而划分序列需要n的时间)而 T(1) = 1            (表示长度为1的序列无法划分子序列,只需要1的时间即可)    T(n) = 2^logn + logn * n   (n被不断二分最终只能二分logn次(最优的情况,每次选取                                的元素都均分序列))        = n + nlogn因此T(n) = O(nlogn)。我的理解是T(n) = 2*T(n/2) + n那么 O(n)= 2^logn + nlogn = n + nlogn.把一个序列分成两个序列的过程是O(n)  而需要logn次。所以  本题复杂度为O(n)。T(n)= T(n/2) + O(1) 这样的次数为logn 则为O(logn),参考二分查找。还有logn级别的算法有如下特点while(count < n){         count /=2;}
	
				
		
原创粉丝点击