zoukankan      html  css  js  c++  java
  • 排序

    下面是几种内部排序算法:

    1.冒泡排序;

    2.插入排序;

    3.希尔排序;

    4.堆排序;

    5.归并排序;

    6.快速排序。

    没有什么排序算法能做到在任何时候都是最好的排序算法。

    下面是各排序算法的C语言实现:

    typedef long int Elemtype;
    
    void swap(long int *a,long int *b)
    {
        long temp;
        temp = *a;
        *a = *b;

    冒泡排序,可以对单链表使用,不必要求元素随机存储。

    void Bubble_Sort(Elemtype A[],int N)
    {
        int i,j;
        for(i=N-1;i>=0;--i)
        {
            int flag = 0;
            for(j=0;j<i;++j)
            {
                if(A[j]>A[j+1])//稳定的 
                {
                    swap(&A[j],&A[j+1]);
                    flag = 1;
                }
            }
            if(flag==0) break;
        }
    }

    插入排序,有T(N+I),其中I为逆序对的数量。

    void Insert_Sort(Elemtype A[],int N)
    {
        int i,j;
        for(i=1;i<N;++i)
        {
            int temp = A[i];
            for(j=i;j>0&&A[j-1]>temp;--j)//稳定 
            {
                A[j] = A[j-1];
            }
            A[j] = temp;
        }
    }

    希尔排序,使用不同的增量序列可以得到不同的时间复杂度。

    //Hibbard增量序列Dk=2^k-1; 
    void Shell_Sort(Elemtype A[],int N)
    {
        int i,j,k;
        for(k=N/2;k>0;k/=2)
        {
            for(i=k;i<N;++i)
            {
                Elemtype temp = A[i];
                for(j=i;j>=k&&A[j-k]>temp;j-=k)
                {
                    A[j] = A[j-k];
                }
                A[j] = temp;
            }
        }
    }

    堆排序,是不稳定的。

    void HeapAdjust(Elemtype *H,int S,int N)
    {
        Elemtype temp = H[S];
        int parent,child;
        for(parent=S;parent*2+1<N;parent=child)
        {
            child = parent*2+1;
            if(child+1<N&&H[child+1]>H[child])
            {
                child += 1;
            }
            if(temp>H[child]) break;
            H[parent] = H[child];
        }
        H[parent] = temp;
    }
    //不稳定 
    void Heap_Sort(Elemtype *A,int N)
    {
        int i;
        for(i=(N-1)/2;i>=0;--i)
        {
            HeapAdjust(A,i,N);
        }
        for(i=N-1;i>0;--i)
        {
            swap(&A[0],&A[i]);
            HeapAdjust(A,0,i);
        }
    }

    归并排序

    void Merge(Elemtype A[],Elemtype temp[],int L,int R,int Rend)
    {
        int Lend = R-1;
        int length = Rend-L+1;
        int cnt = L;
        while(L<=Lend&&R<=Rend)
        {
            if(A[L]<=A[R])
            {
                temp[cnt++] = A[L++];
            }
            else
            {
                temp[cnt++] = A[R++];
            }
        }
        while(L<=Lend) temp[cnt++] = A[L++];
        while(R<=Rend) temp[cnt++] = A[R++];
        while(length-->0)
        {
            A[Rend] = temp[Rend--];
        }
    }
    
    void MSort(Elemtype A[],Elemtype temp[],int S,int E)
    {
        if(S<E)
        {
            int m = (S+E)/2;
            MSort(A,temp,S,m);
            MSort(A,temp,m+1,E);
            Merge(A,temp,S,m+1,E);
        }
    }
    
    void Merge_Sort(Elemtype A[],int N)
    {
        Elemtype *temp;
        temp = (Elemtype*)malloc(sizeof(Elemtype)*N);
        MSort(A,temp,0,N-1);
    }

    快速排序,通过Median函数获取每一轮的排序元素,它是待排序数组,low,mid,high三者的中位数。

    Elemtype Median(Elemtype A[],int low,int high)
    {
        int mid = (low+high)/2;
        if(A[low]>A[mid])
        {
            swap(&A[low],&A[mid]);
        }
        if(A[low]>A[high])
        {
            swap(&A[low],&A[high]);
        }
        if(A[mid]>A[high])
        {
            swap(&A[mid],&A[high]);
        }
        swap(&A[mid],&A[high-1]);
        return A[high-1];
    }
    
    void Insertion_Sort(Elemtype A[],int left,int right)
    {
        int i,j;
        for(i=left+1;i<=right;++i)
        {
            Elemtype temp = A[i];
            for(j=i;j>left&&A[j-1]>temp;--j)
                A[j] = A[j-1];
            A[j] = temp;
        }
    }
    
    void QSort(Elemtype A[],int low,int high)
    {
        if(high-low>100){
            if(low>=high) return;
            Elemtype pivot = Median(A,low,high);
            if(high-low==1) return;//别忘了 ,或在下面加两个while加i<j 
            int i = low,j = high-1;
            while(1)
            {
                while(i<j&&A[++i]<pivot);
                while(i<j&&A[--j]>pivot);
                if(i<j)
                    swap(&A[i],&A[j]);
                else
                    break;
            }
            swap(&A[i],&A[high-1]);
            QSort(A,low,i-1);
            QSort(A,i+1,high);
        }
        else
            Insertion_Sort(A,low,high);
    }
    
    void Quick_Sort(Elemtype A[],int n)
    {
        QSort(A,0,n-1);
    }
  • 相关阅读:
    dimensionality reduction动机---data compression(使算法提速)
    K-means:如何选择K(cluster的数目)
    python2和python3共存方法
    docker postgresql 数据库
    转:MySQL到底能支持多大的数据量?
    数据库jdbc链接:mysql, oracle, postgresql
    python获取参数列表
    转载:ubuntu系统启动顺序,常见系统服务说明
    使用postman开发testcases记录贴
    python gevent使用例子
  • 原文地址:https://www.cnblogs.com/louwqtc/p/Sorts.html
Copyright © 2011-2022 走看看