병합 정렬의 정의
병합 정렬은 안정적인 정렬 알고리즘입니다. 다른 정렬 알고리즘에 비해 상대적으로 빠른 알고리즘입니다. 시간 복잡도는 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).