C++实现自然合并排序

#include<iostream>  
using namespace std;  


int t[9];  
int ta;      //线性扫描得到的标记数  


 void Merge(int c[],int d[],int l,int m,int r);   
 void MergePass(int x[],int y[],int s,int n) ; 
 //先声明函数 
 
void MergeSort(int a[],int n)  
{  
    int *b=new int[n];  
    int s=1;  
    while(s<ta)  
    {  
        MergePass(a,b,s,n);   //合并到数组b  
        s+=s;  //两个数组合并后规模翻倍 
        MergePass(b,a,s,n); //合并到数组a ,并且保证a中的数组元素已经排好序 
        s+=s;  
    }   
} 




void MergePass(int x[],int y[],int s,int n)  
{  
    int i=0;  
    while(i<=ta-2*s)  
    {  //合并大小为s的相邻2段子数组 
        int r=((i+2*s)<ta)?t[i+2*s]:n;  
  
        Merge(x,y,t[i],t[i+s]-1,r-1);  
        i=i+2*s;  
    }  
    if(i+s<ta)  //剩下元素少于2s,即s~2s 
        Merge(x,y,t[i],t[i+s]-1,n-1);  
    else  if(i<ta)   
    {  
        for(int j=t[i];j<=n-1;j++)  
            y[j]=x[j];  
    }  
}  




 
void Merge(int c[],int d[],int l,int m,int r)  
{//合并c[l:m]和c[m+1:r]到d[l:r]   
     
    int i=l,j=m+1,k=r;
	  
    while((i<=m)&&(j<=r))  
    {  
        if(c[i]<=c[j])  
            d[l++]=c[i++];  //d[l]=c[i],l++,i++ 
        else  
            d[l++]=c[j++];  
    }  
    if(i>m)                        
        for(int q=j;q<=r;q++)        //说明i全部复制到d了,只需把剩下的j复制到d中,且此时c中元素是有序的,可以直接复制  
            d[l++]=c[q];  
    else  
        for(int p=i;p<=m;p++)        //说明j全部复制到d了,只需把剩下的i复制到d中,且此时c中元素是有序的,可以直接复制 
            d[l++]=c[p];  
}  
  
void PrintArray(int a[],int n)  
{ //输出数组中的元素 
    for(int i=0;i<n;i++)  
        cout<<a[i]<<" ";  
    cout<<endl;  
}  
  
  
void GetBPoint(int a[],int b[],int n,int &m)  
{ //自然合并排序线性扫描得到的标记数 
    int j=0;  
    b[j++]=0;  
    for(int i=0;i<n-1;i++)  
    {  
        if(a[i+1]<a[i])  
            b[j++]=i+1; //记录端点 
    }  
    m=j;  //记录端点个数 
}   
  
  
int main()  
{   
    int a[]={4,9,2,6,1,5,7,3}; 
    cout<<"原数组:"; 
    PrintArray(a,8);  
    GetBPoint(a,t,8,ta);  
    MergeSort(a,8);  
    cout<<"排序后:";
    PrintArray(a,8);  
    return 0;  
}  

下面是一个简单的C++代码实现,用于合并排序两个已排序的数组。这是一个递归算法,将数组分成两部分,对每个部分进行排序,之后将它们合并在一起: ```c++ #include <iostream> #include <vector> using namespace std; // 合并两个已排序的子数组 void merge(vector<int>& nums, int left, int mid, int right) { vector<int> temp(right - left + 1); int i = left, j = mid + 1, k = 0; while (i <= mid && j <= right) { if (nums[i] <= nums[j]) { temp[k++] = nums[i++]; } else { temp[k++] = nums[j++]; } } while (i <= mid) { temp[k++] = nums[i++]; } while (j <= right) { temp[k++] = nums[j++]; } for (int p = 0; p < k; ++p) { nums[left + p] = temp[p]; } } // 合并排序函数 void merge_sort(vector<int>& nums, int left, int right) { if (left >= right) return; int mid = (left + right) / 2; merge_sort(nums, left, mid); merge_sort(nums, mid + 1, right); merge(nums, left, mid, right); } int main() { vector<int> nums = {3, 5, 1, 7, 2, 9, 4, 6}; merge_sort(nums, 0, nums.size() - 1); for (int num : nums) { cout << num << " "; } return 0; } ``` 这里使用了一个辅助函数 `merge()`,它用于合并两个已排序的子数组。主要思路是创建一个临时数组,将两个子数组中的元素按顺序插入到这个数组中,然后将临时数组中的元素复制回原数组中。 合并排序函数 `merge_sort()` 是递归的,它将数组分成两个部分,对每个部分分别进行排序,然后将它们合并在一起。当数组的大小为1时,排序完成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值