병합, 정렬 및 정렬

병합 정렬의 정의

병합 정렬은 안정적인 정렬 알고리즘입니다. 다른 정렬 알고리즘에 비해 상대적으로 빠른 알고리즘입니다. 시간 복잡도는 O (n × log (n))이지만 손실 공간이 필요하고 공간 복잡도는 O (n)입니다. 즉, 하위 배열을 정렬하려면 추가 배열이 필요합니다.

정렬에는 많은 종류가 있다는 것을 알고 있습니다. 버블 링과 균등 ​​정렬에 대해 배운 후에 실제로는 버블 링과 반감, 병합 정렬의 일종의 조합이 있습니다.
병합 및 정렬의 개념은 분할 및 정복의 네 단어로 요약됩니다.
소위 분할 및 정복은 무질서한 데이터를 특정 규칙에 따라 작은 조각으로 잘라서 특정 순서로 배열하는 것입니다. 예를 들어 이제 4 개의 숫자 4 3 2 1이있는 경우 2 개, 43 개 그룹 1 개, 21 개 그룹 1 개로 자릅니다. 두 그룹으로 정렬하는 것은 매우 간단합니다. 결과는 34와 12입니다. 다시 12 34의 순서로.

여기에 사진 설명 삽입


애니메이션 프레젠테이션

여기에 사진 설명 삽입

여기에 사진 설명 삽입


모듈 설명

병합

이것은 첫 번째 애니메이션 효과에 해당합니다.

void merge(vector<int>&vec,int left,int mid,int right)
{
    
    
	//定义辅助容器,用来存放合并后的数据
    vector<int>helper(right-left+1,0);
    int p1 = left,p2 = mid + 1;
    int index = 0;
    //这里就是比较存放,将小的那一个存放入helper辅助数组内
    while(p1<=mid&&p2<=right)helper[index++] = (vec[p1]<vec[p2]?vec[p1++]:vec[p2++]);
    //当然,总会有一些数据没有被存放,下面的操作就是将其也存放进去
    while(p1<=mid)helper[index++] = vec[p1++];
    while(p2<=right)helper[index++] = vec[p2++];
    //将helper内整理好的数据重新放回vec容器
    for(int i=0;i<helper.size();++i)vec[left+i] = helper[i];
}

스플릿

//拆分递归
void mergeSort(vector<int>&vec,int left,int right)
{
    
    
	//注意,要及时返回ruturn,不能一只无限拆
    if(left>=right)return;
    //定义mid就是为了将一组数拆成两部分
    int mid = left + ((right-left)>>1);
    mergeSort(vec, left, mid);
    mergeSort(vec,mid+1,right);
    merge(vec,left,mid,right);
}

//重载
void mergeSort(vector<int>&vec){
    
    
	//如果只有一个数据就没有必要排序了
    if(vec.size()<2)return;
    mergeSort(vec,0,(int)vec.size()-1);
}

합계 코드 데모

#include<bits/stdc++.h>
using namespace std;
#define gcd __gcd;
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define pre(i,a,b) for(int i=a;i>=b;--i)
#define m(x) memset(x,0,sizeof x);

void merge(vector<int>&vec,int left,int mid,int right)
{
    
    
    vector<int>helper(right-left+1,0);
    int p1 = left,p2 = mid + 1;
    int index = 0;
    while(p1<=mid&&p2<=right)helper[index++] = (vec[p1]<vec[p2]?vec[p1++]:vec[p2++]);
    while(p1<=mid)helper[index++] = vec[p1++];
    while(p2<=right)helper[index++] = vec[p2++];
    //将helper内整理好的数据重新放回vec容器
    for(int i=0;i<helper.size();++i)vec[left+i] = helper[i];
}


//拆分递归
void mergeSort(vector<int>&vec,int left,int right)
{
    
    
    if(left>=right)return;
    int mid = left + ((right-left)>>1);
    mergeSort(vec, left, mid);
    mergeSort(vec,mid+1,right);
    merge(vec,left,mid,right);
}

//重载
void mergeSort(vector<int>&vec){
    
    
    if(vec.size()<2)return;
    mergeSort(vec,0,(int)vec.size()-1);
}

int main(){
    
    
    vector<int>vec;
    int n,x;
    scanf("%d",&n);
    rep(i, 1, n){
    
    
        scanf("%d",&x);
        vec.push_back(x);
    }
    mergeSort(vec);
    rep(i, 0, n-1){
    
    
        if(i!=n-1)cout << vec[i] << " ";
        else cout << vec[i] << endl;
    }
    return 0;
}


관련 사진은 [Darkness Dominates Blog]에서 가져온 것으로, 침략은 삭제해야합니다 (https://blog.csdn.net/engineerhe/article/details/104065282).

추천

출처blog.csdn.net/DAVID3A/article/details/115261540