//确定分界点
//递归排序左右
//归并合二为一
//总体思想:分治
//先进行递归分治 在一个小区间进行排序 之后回溯在一个左右区间都排好的大区间排序 最后归为一个大区间排序
//比如:1 3--7 4 --8 9 -- 10 3-- 4 8
//第一次1 3 --4 7 --8 9--3 10 -- 4 8
//第二次:1 3 4 7 8 --3 4 8 9 10
//最后一次:1 3 3 4 4 7 8 8 9 10
#include "iostream"
const int N=1e2;
int temp[N];
//双指针算法 时间复杂度:O(nlogn) 稳定算法
void merge_sort(int arr[],int left,int right){
if(left==right)return ;//这种情况下分区里面只有一个数
int mid=left+right>>1;
//先递归
merge_sort(arr,left,mid);
merge_sort(arr,mid+1,right);
//对每一个左右小区间进行排序操作
int m_i=left,m_j=mid+1,k=0;
while(m_i<=mid&&m_j<=right){
if(arr[m_i]<arr[m_j])temp[k++]=arr[m_i++];
else temp[k++]=arr[m_j++];
}
//每一层归并
while(m_i<=mid)temp[k++]=arr[m_i++];
while(m_j<=right)temp[k++]=arr[m_j++];
// 赋值给原数组最后一次操作是整个大区间
for(int i=left,j=0;i<=right;i++,j++)arr[i]=temp[j];//i<=right i<right有一个没顾及
}
归并排序C++
最新推荐文章于 2024-11-02 20:20:37 发布