归并排序(Merge Sort)

基本思想:

归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。

归并排序示例:

 


合并方法:

设r[i…n]由两个有序子表r[i…m]和r[m+1…n]组成,两个子表长度分别为n-i +1、n-m。

  1. j=m+1;k=i;i=i; //置两个子表的起始下标及辅助数组的起始下标
  2. 若i>m 或j>n,转⑷ //其中一个子表已合并完,比较选取结束
  3. //选取r[i]和r[j]较小的存入辅助数组rf
    如果r[i]<r[j],rf[k]=r[i]; i++; k++; 转⑵
    否则,rf[k]=r[j]; j++; k++; 转⑵
  4. //将尚未处理完的子表中元素存入rf
    如果i<=m,将r[i…m]存入rf[k…n] //前一子表非空
    如果j<=n ,  将r[j…n] 存入rf[k…n] //后一子表非空
  5. 合并结束。

    归并的迭代算法

    #include"iostream"
    using namespace std;
    void swap(int *a, int *b)
    {
    	int tmp = *a;
    	*a = *b;
    	*b = tmp;
    }
    
    void print(int arr[], int length)
    {
    	for(int i = 0; i < length; i ++)
    	{
    		cout << arr[i] << " ";
    	}
    	cout << endl;
    }
    void Merge(int *arr, int *arr1, int start, int m, int end)
    {
    	int i, j, k;
    	for(i = start, j = m + 1, k = i; i <= m && j <= end; k ++)
    	{
    		if(arr[i] <= arr[j])
    		{
    			arr1[k] = arr[i];
    			i ++;
    		}
    		else
    		{
    			arr1[k] = arr[j];
    			j ++;
    		}
    	}
    	while(i <= m)
    	{
    		arr1[k] = arr[i];
    		i ++;
    		k ++;
    	}
    	while(j <= end)
    	{
    		arr1[k] = arr[j];
    		j ++;
    		k ++;
    	}
    	for(int p = start; p <= end; p++)
    	{
    		arr[p] = arr1[p];
    	}
    }
    void Merge_Recursive(int *arr,int *arr1, int start, int end)
    {
    	if(start < end)
    	{
    		int x = (start + end) / 2;
    		Merge_Recursive(arr, arr1, start, x);
    		Merge_Recursive(arr, arr1, x + 1, end);
    		Merge(arr, arr1, start, x, end);
    		cout << endl;
    		print(arr, 10);
    	}
    }
    void MergeSort(int arr[], int arr1[], int length)
    {
    	Merge_Recursive(arr, arr1, 0, length - 1);
    }
    int main()
    {
    	int arr[10] = {8, 7, 5, 4, 3, 0, 2, 1, 9, 6};
    	int arr1[10] = {2,1,9,6};
    	print(arr, 10);
    	MergeSort(arr, arr1, 10);
    	//QuickSort(arr, 0, 9);
    	//print(arr, 4);
    	int k = 0;
    	cin >> k;
    }
    
    


归并的迭代算法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值