美文网首页
c算法O(n*log n)(二)

c算法O(n*log n)(二)

作者: 程序猿峰岑 | 来源:发表于2020-01-16 18:31 被阅读0次

归并排序Merge Sort

自顶向下进行排序

//归并排序
#include<iostream>
#include<algorithm>
using namespace std;



template<typename T>
void _mergeSort(T arr[],int l,int mid,int r){
   T aux[r-l+1];
   for (int i = l; i < r; i++)
   aux[i-l] = arr[i];
   int i=l,j=mid+1;
   for (int k = l; k < r; k++)
   {
       if (i>mid)
       {
           arr[k] = aux[j-l];
           j++;
       }

       else if (j>r)
       {
           arr[k] = aux[i-l];
           i++;
       }

       else if (aux[i-l]<aux[j-l])
       {
           arr[k] = aux[i-l];
           i++;
       }
       else
       {
           arr[k] = aux[j-l];
           j++;
       }
       
       
   }
   
   
   
}

//递归使用归并排序,对[l...r]的范围进行排序
template<typename T>
void __mergeSort(T arr[],int l,int r){
    if (l>=r)
        return;
    int mid = (r-l)/2 + l;
    __mergeSort(arr,0,mid);
    __mergeSort(arr,mid+1,r);
    _mergeSort(arr,l,mid,r);
    
}
template<typename T>
void mergeSort(T arr[],int n){
   __mergeSort(arr,0,n-1);
}

自底向上进行归并排序

//自低向上归并排序 Merge Sort
template<typename T>
void mergeSortBU(T arr[],int n){
    for (int sz = 1; sz < n; sz += sz)
        for (int i = 0; i + sz < n; sz+=sz+sz)
            //对arr[i...i+sz-1]和arr[i+sz...i+2*sz-1]进行归并
            _mergeSort(arr,i,i+sz,min(i+sz+sz+1,n-1));
}

快速排序

//快速排序
#include<iostream>
#include<algorithm>
using namespace std;
template<typename T>
//返回p,使得arr[l...p-1]<arr[p] arr[p+1...r]>arr[p]
int __partition(T arr[],int l,int r){
    T v = arr[l];
    //arr[l+1...j]<v arr[j+1...i]>v
    int j = l;
    for (int i = l+1; i < r; i++)
    {
        if (arr[i]<v)
        {
            swap(arr[j+1],arr[i]);
            j++;
        }
        
    }

    swap(arr[l],arr[j]);
    return j; 
}

//对arr[l...r]部分进行快速排序
template<typename T>
void __quickSort(T arr[],int l,int r){
    if (l>=r)
    return;
    int p = __partition(arr,l,r);
    __quickSort(arr,l,p-1);
    __quickSort(arr,p+1,r);
    
}

template<typename T>
void __quickSort(T arr[],int n) {
    __quickSort(arr,0,n-1);
}

相关文章

网友评论

      本文标题:c算法O(n*log n)(二)

      本文链接:https://www.haomeiwen.com/subject/hpvfzctx.html