常用排序算法总结(四)

4.归并排序

   归并排序也是采用分治思想。归并算法就是把两个或两个以上的有序表合并成为一个新的有序表。例如:

   有序表1: 1 3 5

   有序表2: 2 4

   每次从两表的第一个元素中选取最小的元素排在新的有序表中。

   两个有序表的归并过程:

     ①

         有序表1: 3 5

         有序表2: 2 4

         新有序表:1

     ②

         有序表1: 3 5

         有序表2: 4

         新有序表:1 2

     ③

         有序表1: 5

         有序表2: 4

         新有序表:1 2 3

     ④

         有序表1: 5

         有序表2:

         新有序表:1 2 3 4

     ⑤

         有序表1:

         有序表2:

         新有序表:1 2 3 4 5

所以对一个序列,可以将它分成前后两个序列,子序列还可以分成前后两个子序列,依次直到子序列为前后两个元素,然后子序列进行归并调整成为一个有序序列。




C语言:

//2路归并序列
void Merge(int *array,int low,int mid,int high)
{
	int *base=(int *)malloc(sizeof(int)*(high-low+1));
	if(!base)
		exit(0);
	for(int n=0;n<high-low+1;n++)
		base[n]=array[low+n];  //复制数组
	int i=low,j=mid+1,m=0;
	while(i<mid+1||j<high+1)  //归并两个序列
	{
		if((j>high)||(i<mid+1&&array[i]<array[j]))
			base[m++]=array[i++];
		else
			base[m++]=array[j++];
	}
	for(n=0;n<high-low+1;n++)
		array[low+n]=base[n];
	free(base);  //释放内存
}

void MergeSort(int *array,int low,int high)
{
	if(array==NULL)
		return;
	if(low<high)
	{
		int mid=(low+high)/2;
		MergeSort(array,low,mid);   //归并左区间
		MergeSort(array,mid+1,high);//归并右区间
		Merge(array,low,mid,high);
	}
}

Java语言:

public class MergeSort {
	public static void merge(int array[], int low, int mid, int high) {
		if (array == null)
			return;
		int temp[] = new int[high-low+1];  //辅助数组
		int i=low,j=mid+1,m=0;
		while(i<mid+1||j<high+1){     //排序
			if(j>high||(i<mid+1&&array[i]<array[j]))
				temp[m++]=array[i++];
			else
				temp[m++]=array[j++];
		}
		for(int n=0;n<high-low+1;n++)  //将归并后的值赋给原数组
			array[n+low]=temp[n];
	}

	public static void sort(int array[],int low,int high) {
		if(array==null)
			return;
		int mid=0;
		if(low<high){
			mid=(low+high)/2;
			sort(array,low,mid);  //排序左区间
			sort(array,mid+1,high);  //排右有区间
			merge(array, low, mid, high);
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值