• 归并排序


    二路归并排序

    //二路归并排序
    //分治法
    //自底向上的二路归并排序算法
    #include<stdio.h>
    #include<malloc.h>
    void disp(int a[],int n){
        int i;
        for(i=0;i<n;i++)
            printf("%d ",a[i]);
        printf("
    ");
    }
    void Merge(int a[],int low,int mid,int high){
        //将a[low..mid]和a[mid+1..high]两个相邻的有序子序列归并为一个有序子序列a[low..high] 
        int *tmp;
        int i = low,j = mid+1,k = 0;
        tmp = (int *)malloc((high - low + 1)*sizeof(int));
        while(i < mid && j < high){
            if(a[i] <= a[j]){
                tmp[k] = a[i];
                i++;
                k++;
            }
            else{
                tmp[k] = a[j];
                j++;
                k++;
            }
        }    
        while(i <= mid){
            tmp[k] = a[i];
            i++;
            k++;
        }
        while(j <= high){
            tmp[k] = a[j];
            j++;
            k++;
        }
        for(k = 0,i = low;i<=high;k++,i++)
            a[i] = tmp[k];
        free(tmp);
    }
    void MergePass(int a[],int length,int n){    //进行一趟二路归并排序 
        int i;
        for(i=0;i+2*length-1 < n;i = i+2*length)
            Merge(a,i,i+length-1,i+2*length-1);
        if(i+length-1 < n)
            Merge(a,i,i+length-1,n-1); 
    }
    void MergeSort(int a[],int n){
        int i; 
        for(int i = 1;i<n;i = 2*i)
            MergePass(a,i,n);
    }
    int main(){
        int n = 10;
        int a[] = {2,5,1,7,10,6,9,4,3,8};
        printf("排序前:");
        disp(a,n);
        MergeSort(a,n);        //二路归并算法 
        printf("排序后:");
        disp(a,n);
        return 0; 
    }
    

      三路归并排序

    //三路归并排序
    void merge3(int a[],int l,int s1,int s2,int r){
    	int i,j,k,h,*ta;
    	i = l;
    	j = s1+1;
    	h = 0;
    	ta = (int *)malloc((r-l+1)*sizeof(int));
    	while(i<=s1 && j<=s2){	//将a[l..s1]和a[s1+1..s2]合并排序
     		if(a[i] <= a[j])	
    			ta[h++] = a[i++];
    		else
    			ta[h++] = a[j++];	
    	} 
    	while(i <= s1)
    		ta[h++] = a[i++];
    	while(j <= s2)
    		ta[h++] = a[j++];
    	//将前两段的合并结果再和第三段合并
    	for(k = 0;k < h;k++)
    		a[l+k] = ta[k];
    	i = l;
    	j = s2+1;
    	h = 0;
    	while(i<=s2 && j<= r){
    		if(a[i] <= a[j])	
    			ta[h++] = a[i++];
    		else
    			ta[h++] = a[j++];	
    	} 
    	while(i <= s2)
    		ta[h++] = a[i++];
    	while(j <= r)
    		ta[h++] = a[j++];
    	for(k = 0;k < h;k++)
    		a[l+k] = ta[k];
    	free(ta);
    }
    

      

  • 相关阅读:
    2012 人民搜索 实习生招聘 笔试题(转)
    招行两地一卡——PayPal美元兑换人民币的最佳解决方案
    PHP上传图片类
    PHP获取随机数
    Linux下解压RAR软件下载和解压.zip和.rar文件
    Zend Framework学习(1)简介
    编程指导
    Zend Framework数据库操作总结
    Zend Framework学习(4)之前端控制器
    参数是否为FALSE的区别
  • 原文地址:https://www.cnblogs.com/Hqx-curiosity/p/12151767.html
Copyright © 2020-2023  润新知