• 【分治的典型应用:归并排序】


    分析

    数组排序任务可以如下完成:
    1.把前一半排序
    2.把后一半排序
    3.把两半归并到到一个新的有序数组,然后再拷贝回原数组,排序完成。

    归并排序的时间复杂度

    对n个元素进行排序的时间:
    T(n)=2T(n/2)+an (a是常数,具体多少不重要)
    =2T(sT(n/4)+an/2)+an
    =4T(n/4)+2an
    ……
    =2k*T(n/2k)+kan
    一直做到n/2^k=1(此时k=log(2,n)),
    T(n)=2^kT(1)+kan
    =2^k+k
    an
    =n+a
    (log(2,n))*n
    复杂度O(nlogn)

    代码

    #include <iostream>
    using namespace std;
    int a[10]={13,27,19,2,8,12,2,8,30,89};
    int b[10];
    void Merge(int a[],int s,int m,int e,int tmp[])
    {//将数组a[s,m]和a[m+1,e]合并到tmp,并保存在tmp有序,然后再拷贝回a[s,m]。
    //归并操作的时间复杂度是:O(e-m+1),即O(n)
    	int pb=0;
    	int p1=s,p2=m+1;
    	while(p1<=m&&p2<=e)
    	{
    		if(a[p1]<a[p2])
    		{
    			tmp[pb++]=a[p1++];
    		}
    		else
    		{
    			tmp[pb++]=a[p2++];
    		}
    	}
    	while(p1<=m)
    	{
    		tmp[pb++]=a[p1++];
    	}
    	while(p2<=e)
    	{
    		tmp[pb++]=a[p2++];
    	}
    	for(int i=0;i<e-s+1;++i)
    	{
    		a[s+i]=tmp[i];
    	}
    }
    void MergeSort(int a[],int s,int e,int tmp[])
    {
    	if(s<e)
    	{
    		int m=s+(e-s)/2;
    		MergeSort(a,s,m,tmp);
    		MergeSort(a,m+1,e,tmp);
    		Merge(a,s,m,e,tmp);
    	}
    }
    int main()
    {
    	int size=sizeof(a)/sizeof(int);
    	MergeSort(a,0,size-1,b);
    	for(int i=0;i<size;++i)
    	{
    		cout<<a[i]<<",";
    	}
    	cout<<endl;
    	return 0;
    }
    
  • 相关阅读:
    OC-数组类
    OC-字符串函数
    C——位操作
    C——字符串练习
    C语言——指针习题
    指针数组和数组指针
    数组指针和指针数组的区别
    cocos2d-iphone中兼容iphone/ipad的问题
    一个Universal程序还是iPhone、iPad俩个版本 ?
    objective-c获取自1970年以来的毫秒数
  • 原文地址:https://www.cnblogs.com/AlexKing007/p/12339457.html
Copyright © 2020-2023  润新知