归并排序

你。 提交于 2020-01-07 16:28:32

二路归并排序

//二路归并排序
//分治法
//自底向上的二路归并排序算法
#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("\n");
}
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);
}

  

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!