当前位置:编程学习 > C/C++ >>

排序算法实现

1.插入排序
 
[cpp]  
template <typename Comparable>  
void insertionSort(vector<Comparable>& a)  
{  
    int j;  
  
    for(int p=1;p<a.size();p++)  
    {  
        Comparable tmp=a[p];  
  
        for(j=p;j>0&&tmp<a[j-1];j--)  
            a[j]=a[j-1];  
        a[j]=tmp;  
    }  
}  
有R个逆序,因此运行时间为O(R+N)。若逆序数为O(N),则以线性时间运行。R为N(N-1)/4,因此为Ω(N^2).
2.希尔排序(有时也叫缩减增量排序)
 
a.希尔排序(基于插入排序,使用希尔增量)
 
[cpp]  
template <typename Comparable>  
void shellsort(vector<Comparable>& a)  
{  
    for(int gap=a.size()/2;gap>0;gap/=2)  
        for(int i=gap;i<a.size();i++)  
        {  
            Comparable tmp=a[i];  
            int j=i;  
  
            for(;j>=gap&&tmp<a[j-gap];j-=gap)  
                a[j]=a[j-gap];  
            a[j]=tmp;  
        }  
}  
 
b.希尔排序(基于简单交换排序,使用希尔增量)
 
[cpp] 
void shellsort(int v[],int n)//based on 易做图 exchange sort  
{  
    int gap,i,j,temp;  
    for(gap=n/2;gap>0;gap/=2)  
        for(i=gap;i<n;i++)  
            for(j=i-gap;j>=0&&v[j]>v[j+gap];j-=gap){  
                temp=v[j];  
                v[j]=v[j+gap];  
                v[j+gap]=temp;  
            }  
}  
使用希尔增量的希尔排序每一趟排序是插入排序或简单交换排序,因此最坏是O(N^2)的。
3.堆排序
 
[cpp] 
inline int leftChild(int i)//root index is 0  
{  
    return 2*i+1;  
}  
  
template <typename Comparable>  
void percDown(vector<Comparable>& a,int i,int n)  
{  
    int child;  
    Comparable tmp;  
  
    for(tmp=a[i];leftChild(i)<n;i=child)  
    {  
        child=leftChild(i);  
        if(child!=n-1&&a[child]<a[child+1])//if there is right child  
            child++;  
        if(tmp<a[child])  
            a[i]=a[child];  
        else  
            break;  
    }  
    a[i]=tmp;  
}  
  
template <typename Comparable>  
void heapsort(vector<Comparable>& a)  
{  
    for(int i=a.size()/2;i>=0;i--)//buildHeap  
        percDown(a,i,a.size());  
    for(int j=a.size()-1;j>0;j--)    //deleteMax  
    {  
        swap(a[0],a[j]);//通过最大堆将数组以递增序排列,可节省一个辅助数组。  
        percDown(a,0,j);  
    }  
}  
构建堆花费O(N),然后执行N次deleteMax操作,每次花费O(log N)。因此总运行时间为O(N log N)。
 
 
4.归并排序
 
[cpp] 
template <typename Comparable>  
void merge(vector<Comparable>& a,vector<Comparable>&tmpArray,int leftPos,int rightPos,int rightEnd)  
{  
    int leftEnd=rightPos-1;  
    int tmpPos=leftPos;  
    int numElements=rightEnd-leftPos+1;  
  
    while(leftPos<=leftEnd&&rightPos<=rightEnd)  
    {  
        if(a[leftPos]<a[rightPos])  
            tmpArray[tmpPos++]=a[leftPos++];  
        else  
            tmpArray[tmpPos++]=a[rightPos++];  
    }  
  
    while(leftPos<=leftEnd)  
        tmpArray[tmpPos++]=a[leftPos++];  
    while(rightPos<=rightEnd)  
        tmpArray[tmpPos++]=a[rightPos++];  
  
    for(int i=0;i<numElements;i++,rightEnd--)  
        a[rightEnd]=tmpArray[rightEnd];  
}  
  
template <typename Comparable>  
void mergeSort(vector<Comparable>& a,  
               vector<Comparable>& tmpArray,int left,int right)  
{  
    if(left<right)  
    {  
        int center=(left+right)/2;  
        mergeSort(a,tmpArray,left,center);  
        mergeSort(a,tmpArray,center+1,right);  
        merge(a,tmpArray,left,center+1,right);  
    }  
}  
  
template <typename Comparable>  
void mergeSort(vector<Comparable>& a)  
{  
    vector<Comparable> tmpArray(a.size());  
  
    mergeSort(a,tmpArray,0,a.size()-1);//单参驱动多参函数  
}  
 
O(N log N)。
5.快速排序
 
从左向右依次判断,取中间索引为分划枢纽:
 
[cpp]  
//order v ascendent  
void qsort(int v[],int left,int right)  
{  
    int i,last;  
    void swap(int v[],int i,int j);  
  
  
    if(left>=right)  
        return;  
    swap(v,left,(left+right)/2);//the element to d
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,