排序

快排(O(nlogn)--O(n2))

click!!
void qsort(int l,int r)
{  
    int i,j,mid,p;
    i=l;  j=r; 
    mid=a[(l+r) / 2];            //将当前序列在中间位置的数定义为分隔数
    do
    {
       while (a[i]<mid) i++;  //在左半部分寻找比中间数大的数
       while (a[j]>mid) j--;    //在右半部分寻找比中间数小的数
       if (i<=j) 
        {                                //若找到一组与排序目标不一致的数对则交换它们
            p=a[i];
            a[i]=a[j];
            a[j]=p;
            i++;   j--;                //继续找
        }
    }
    while (i<=j);                  //注意这里不能有等号
    if (l<j)  qsort(l,j);           //若未到两个数的边界,则递归搜索左右区间
    if (i<r)  qsort(i,r);
}

归并(O(nlog(n))

click!!
void msort(int s,int t)
{
    if(s==t) return;              //如果只有一个数字则返回,无须排序
    int mid=(s+t)/2;
    msort(s,mid);                //分解左序列
    msort(mid+1,t);            //分解右序列
    int i=s, j=mid+1, k=s;   //接下来合并
    while(i<=mid && j<=t)
    {
          if(a[i]<=a[j])  
          {
                r[k]=a[i]; k++; i++;
           }else{
                        r[k]=a[j]; k++; j++;
                    }
      }  
      while(i<=mid)               //复制左边子序列剩余
      {
           r[k]=a[i]; k++; i++;
       }
       while(j<=t)                   //复制右边子序列剩余  
       {
            r[k]=a[j]; k++; j++;
        }
        for(int i=s; i<=t; i++) a[i]=r[i];  
        return 0;
} 

逆序对

click!!
void msort(int s,int t)
{
    if(s==t) return;                  //如果只有一个数字则返回,无须排序
    int mid=(s+t)/2;
    msort(s,mid);                   //分解左序列
    msort(mid+1,t);                //分解右序列
    int i=s, j=mid+1, k=s;       //接下来合并
    while(i<=mid && j<=t)
    {
        if(a[i]<=a[j]) 
        {     r[k]=a[i]; k++; i++;
        }else{
                    r[k]=a[j]; k++; j++;  
                     ans+=mid-i+1;  //统计产生逆序对的数量
                 }
    }
    while(i<=mid)                   //复制左边子序列剩余
    {
         r[k]=a[i]; k++; i++;
    }
    while(j<=t)                         //复制右边子序列剩余
    {
         r[k]=a[j]; k++; j++;
    }
    for(int i=s; i<=t; i++) a[i]=r[i];
    return 0;
}
posted @ 2021-10-06 15:57  fanshu糖水  阅读(32)  评论(0)    收藏  举报