归并排序
归并排序的重点是合并,利用双指针算法,排序的是否稳定是指如果两个数的大小相同,在经过排序后相对位置不变,那么这个排序就是稳定的,否则就是不稳定的
归并排序的思路是将数组按照mid分开成为两部分,然后先进行递归再排序,排序时按照双指针算法进行排序,用temp存放结果最后将temp中的结果赋值给排序数组,用于后续递归操作,具体思路写在代码注释里面了
#include <iostream>
using namespace std;
const int N =100010;
int q[N], tmp[N];
void merge_sort(int q[], int l, int r)
{
if(l >= r) return ;
else
{
int mid = l + r >>1;
merge_sort(q, l, mid);
merge_sort(q, mid + 1, r);
int i = l, j = mid + 1, k = 0;
//双指针合并操作,两个部分都是有序的
while(i <= mid && j <= r)
{
if(q[i] <= q[j]) tmp[k ++] = q[i ++];//选取两部分中较小的放进temp中去
else tmp[k ++] = q[j ++];
}
//下面两部分最多只有一部分会执行,也就是说最后剩下的那个部分就是最大的了
while(i <= mid) tmp[k ++] = q[i ++];
while(j <= r) tmp[k ++] = q[j ++];
//最后将temp数组里的值反向赋值回q中去
for(i = l, j = 0; i <= r; j ++,i ++) q[i] = tmp[j];
}
}
int main()
{
int n;
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;
}
本文来自博客园,作者:LYL233,转载请注明原文链接:https://www.cnblogs.com/amour233/p/16466778.html

浙公网安备 33010602011771号