归并排序模板
void merge_sort(int q[], int l, int r)
{
if (l >= r)
return;
int mid = l + r >> 1;
//是一种计算中间值的常见写法。它使用了位运算符 >>,表示右移操作,用于将 (l + r) 的结果右移
//一位,相当于除以2。
//这种写法是因为在计算机中,右移操作比除法运算更高效。使用位运算进行右移操作可以在一些情况下提
//高代码的执行效率。
//请注意,这种写法要求 l 和 r 的类型是整数类型。如果 l 和 r 是浮点数类型,你需要使用除法运算
//符 / 来计算中间值。
//递归处理左右两边
merge_sort(q, l, mid);
merge_sort(q, mid + 1, r);
//归并,将两个有序数组合并
int k = 0, i = l, j = mid + 1;
while (i <= mid && j <= r)
if (q[i] <= q[j]) tmp[k ++ ] = q[i ++ ];
else tmp[k ++ ] = q[j ++ ];
//把没有循环完的部分数组直接放入临时数组末尾
while (i <= mid) tmp[k ++ ] = q[i ++ ];
while (j <= r) tmp[k ++ ] = q[j ++ ];
//将临时数组存入数组中
for (i = l, j = 0; i <= r; i ++, j ++ ) q[i] = tmp[j];
}
归并排序例题详解
给定n个无序数组,采用归并排序的方法输出为有序数组。
#include <iostream>
using namespace std;
const int N = 1e6 + 10;
int n;
int q[N];
int temp[N];
void merge_sort(int q[],int l,int r)
{
if(l>=r)
return;
//取区间中点
int mid = l+r>>1;
//递归排序左右两边
merge_sort(q,l,mid);
merge_sort(q,mid+1,r);
//归并
int k=0;
int i=l;
int j=mid+1;
while(i<=mid&&j<=r)//没有循环完时
{
if(q[i]<q[j])
{
temp[k++]=q[i++];
}
else
{
temp[k++]=q[j++];
}
}
//把没循环完而剩下的部分放入数组
while(i<=mid)
{
temp[k++]=q[i++];
}
while(j<=r)
{
temp[k++]=q[j++];
}
//临时数组的结果存会数组中
for(int i=l,j=0;i<=r;i++,j++)
{
q[i]=temp[j];
}
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&q[i]);
}
merge_sort(q,0,n-1);
for(int i=0;i<n;i++)
{
printf("%d ",q[i]);
}
return 0;
}