一个算法稳不稳定不是指时间效率的稳定,而是相对位置不发生变化就是稳定的。(快排不稳定,而归并稳定)思考:如何让快排变得稳定(把快排里面的每一个元素变的都不一样)
归并算法的思想:(双指针算法)
时间复杂度:O(nlog2n)
1.确定分界点
2.递归排序分界点的left跟right
3.合并(一个是重点)
样例分析:有一组数据为1 3 4 5 6 2 9 8 (一共8个数),分成俩组排序后为1 3 4 5 / 2 6 8 9,接着用两个指针分别指向1 2,合二位一。
#include <iostream> #include <algorithm> #include <cstdio> #include <string> 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 ; int mid=(l+r)/2; //分成子问题 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(k=0,i=l;i<=r;k++,i++) q[i]=tmp[k]; ``` } 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; }