分治算法——快速排序,归并排序

http://blog.163.com/hadyk1111@126/blog/static/29599406200752345233993/

快速排序  
http://blog.csdn.net/morewindows/article/details/6684558  
分析:数据结构p186.重要  
当源文件有序时复杂度是o(n2).此时冒泡排序最好,无序时快速排序是最好的方法。  
void QuickSort(int *a,int l,int r)  
{  
    if (r<=l)  
    {  
        return;  
    }  
    int i=l;  
    int j=r;  
    int x=a[i];//a[l]即a[i]就是第一个坑   
    //挖坑填数  
    while (j>i)  
    {  
         // 从右向左找小于x的数来填a[i]    
        while (a[j]>=x&&j>i)  
        {  
            j--;  
        }  
        if (j>i)  
        {  
            a[i]=a[j];//a[j]填到a[i]中,a[j]就形成了一个新的坑    
            i++;  
        }  
        // 从左向右找大于或等于x的数来填a[j]    
        while (a[i]<x&&j>i)  
        {  
            i++;  
        }  
        if (j>i)  
        {  
            a[j]=a[i];//将a[i]填到a[j]中,a[i]就形成了一个新的坑    
            j--;  
        }  
    }  
    //退出时,i等于j。将x填到这个坑中。  
    a[i]=x;  
    //分治法  
    QuickSort(a,l,i-1);  
    QuickSort(a,i+1,r);  
}  
归并排序  
http://blog.csdn.net/morewindows/article/details/6678165  
//将有二个有序数列a[first...mid]和a[mid...last]合并。  
void mergearray(int a[], int first, int mid, int last, int temp[])  
{  
    int i=first;  
    int n=mid;  
    int j=mid+1;  
    int m=last;  
    int k=0;  
    while (i<=n&&j<=m)  
    {  
        //比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数  
        if (a[i]<a[j])  
        {  
            temp[k++]=a[i++];  
        }   
        else  
        {  
            temp[k++]=a[j++];  
        }  
    }  
    //有数列为空,那直接将另一个数列的数据依次取出即可  
    while (i<=n)  
    {  
        temp[k++]=a[i++];  
    }  
    while (j<=m)  
    {  
        temp[k++]=a[j++];  
    }  
   for (i=0;i<k;i++)  
   {  
       a[first+i]=temp[i];  
   }  
}  
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); //再将二个有序数列合并    
    }    
}  



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值