PAT 1035插入与归并

这道题考察的是插入排序和归并排序的实现,首先要做的就是判断使用的是插入排序还是归并排序,我用的方法是:遍历第二个数组,找到第一个不是增序的元素(也就是小于前一个元素的元素),然后从这个元素开始遍历后边的数组,判断当前元素是否与原数组中相同位置的元素相等,若在遍历结束之前出现了不相等,则就是归并排序,否则是插入排序,因为插入排序每次将一个元素放到该放的位置,所以无序的元素和原数组相同。

接下来是在进行一次排序,插入排序很好说,将第一个无序的元素插入到前边有序数列中去就行,而归并排序还有模拟一下判断现在一个归并段的长度是多少,从归并段长度k=1开始模拟,直到和第二个数组完全相同,则下一次的k就是2*k,将第二个数组在进行一次归并即可。 

 

#include <algorithm>
#include <string>
#include <iostream>
#include <vector>
using namespace std;
string str1="Insertion Sort";
string str2="Merge Sort";
int main(){
    int N;
    cin>>N;
    int N1[N],N2[N];
    for(int i=0;i<N;i++){
        cin>>N1[i];
    }
    for(int i=0;i<N;i++){
        cin>>N2[i];
    }
    int j=0;
    while(j<N-1){      //找到第一个无序的元素
        if(N2[j]<=N2[j+1]){
            j++;
        }
        else{
            break;
        }
    }
    j++;
    int temp=j;
    while(j<N){        //判断后面的元素是否都想同
        if(N1[j]==N2[j]){
            j++;
        }
        else{
            break;
        }
    }
    if(j==N){      //都相同则为插入排序
        cout<<str1<<"\n";
        int temp1=N2[temp]; 
        while(N2[temp-1]>temp1&&temp>0&&temp<N){    //在进行一次插入
            N2[temp]=N2[temp-1];
            temp--;
        }
        N2[temp]=temp1;
    }
    else {
        cout<<str2<<"\n";
        int k=1,flag=1;
        while(flag){
            flag=0;
            for(int i=0;i<N;i++){		//判断现在的归并段长度是多少
                if(N1[i]!=N2[i]){
                    flag=1;
                    break;
                }
                
            }
            k*=2;
            if(flag==1){
                for(int i=0;i<N/k;i++){
                    sort(N1+i*k,N1+(i+1)*k);
                }
                sort(N1+N/k*k,N1+N);
            }
            else{                               //找到归并段长度后,对第二个数组进行一次归并
                for(int i=0;i<N/k;i++){  
                    sort(N2+i*k,N2+(i+1)*k);
                }
                sort(N2+N/k*k,N2+N);
            }
        }

    }
    for(int i=0;i<N-1;i++){
        cout<<N2[i]<<" ";
    }
    cout<<N2[N-1];
    return 0;
}

### C++插入排序和归并排序的实现 #### 插入排序 插入排序是一种简单直观的排序算法。该算法通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。 ```cpp void insertionSort(int arr[], int n) { for (int i = 1; i < n; ++i) { int key = arr[i]; int j = i - 1; while (j >= 0 && arr[j] > key) { arr[j + 1] = arr[j]; --j; } arr[j + 1] = key; } } ``` 这段代码展示了如何逐步将每个元素插入到已经排序的部分中[^1]。 #### 归并排序 归并排序采用分治法的思想,先递归地把数组分成两个子数组分别进行排序,再将这两个子数组合并成一个有序数组。 ```cpp void merge(int arr[], int l, int m, int r) { int n1 = m - l + 1; int n2 = r - m; int L[n1], R[n2]; for (int i = 0; i < n1; i++) L[i] = arr[l + i]; for (int j = 0; j < n2; j++) R[j] = arr[m + 1 + j]; int i = 0; int j = 0; int k = l; while (i < n1 && j < n2) { if (L[i] <= R[j]) { arr[k] = L[i]; i++; } else { arr[k] = R[j]; j++; } k++; } while (i < n1) { arr[k] = L[i]; i++; k++; } while (j < n2) { arr[k] = R[j]; j++; k++; } } void mergeSort(int arr[], int l, int r) { if (l < r) { int m = l + (r - l) / 2; mergeSort(arr, l, m); mergeSort(arr, m + 1, r); merge(arr, l, m, r); } } ``` 此部分实现了完整的归并排序逻辑,包括分割数组以及最终的合并操作[^4]。 这两段代码提供了两种不同的排序方式——插入排序适合较小规模的数据集;而归并排序则适用于更大范围内的应用场景,并且具有更稳定的性能表现。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值