• 排序小结(C版)


    一、快速排序(C源码)

    #include <stdlib.h>
    #include <stdio.h>
    
    int adjust(int a[],int start,int end)
    {
        int i=start;
        int j=end;
        int temp=a[start];
        while(i<j)
        {
            while(i<j&&temp<a[j])
                j--;
            if(i<j)
            {
                a[i]=a[j];
                i++;
            }
            while(i<j&&temp>=a[i])
                i++;
            if(i<j)
            {
                a[j]=a[i];
                j--;
            }
        }
        a[i]=temp;
        return i;
    }
    
    void print_array(int array[], int n)  
    {  
        int i;  
        for( i = 0 ; i < n ; ++i )  
            printf("%d ", array[i]);  
        printf("
    ");  
    }  
    
    void quiksort(int a[],int start,int end)
    {    
        if(start<end)
        {
            int m=adjust(a,start,end);
            quiksort(a,start,m-1);
            quiksort(a,m+1,end);
        }
    }
    
    int main()  
    {  
        int array[] = {65, 2, 68, 1, 9, 78,65};
        quiksort(array, 0, 6);
        print_array(array, 7);
        system("pause");
        return 0;
    }

     二、堆排序

    #include <stdlib.h>
    #include <stdio.h>
    
    //最大堆的调整函数
    //注意a[0]不参与排序
    void adjust(int a[],int s,int m)
    {
        int temp=a[s];
        int j;
        for(j=2*s;j<=m;j=2*j)
        {
            if(j<m&&a[j]<a[j+1])
                j++;
            if(temp>a[j])
                break;
            a[s]=a[j];
            s=j;
        }
        a[s]=temp;
    }
    
    //堆排序函数
    void heapsort(int a[],int n)
    {    
        int i;
        int temp;
        for(i=n/2;i>=1;i--)
            adjust(a,i,n);
        for(i=n;i>1;i--)
        {
            temp=a[1];
            a[1]=a[i];
            a[i]=temp;
            adjust(a,1,i-1);
        }
    }
    
    void print_array(int array[], int n)  
    {  
        int i;  
        for( i = 0 ; i < n ; ++i )  
            printf("%d ", array[i]);  
        printf("
    ");  
    } 
    
    int main()  
    {  
        int array[] = {-999,65, 2, 68, 1, 9, 78,65};
        heapsort(array,7);
        print_array(array, 8);
        system("pause");
        return 0;
    }

    三、 二路归并排序

    #include <stdlib.h>
    #include <stdio.h>
    
    //合并相邻的两个有序组
    //a[u,...,v-1]和a[v,...,t]
    void merge(int a[],int b[],int u,int v,int t)
    {
        int i,j,k;
        i=u;
        j=v;
        k=u;
        while(i<=v-1&&j<=t)
        {
            if(a[i]<=a[j])
                b[k++]=a[i++];
            else
                b[k++]=a[j++];
        }
        while(i<=v-1)
        {
            b[k++]=a[i++];
        }
        while(j<=t)
        {
            b[k++]=a[j++];
        }
    }
    
    
    void onepass(int a[],int b[],int s,int n)
    {    
        int u,v,t;
        u=0;
        v=s;
        t=2*s-1;
        while(n-u>=2*s)
        {
            merge(a,b,u,v,t);
            u+=2*s;
            v+=2*s;
            t+=2*s;
        }
        if(n-u>s)
            merge(a,b,u,v,n-1);
        else
        {
            for(;u<n;u++)
                b[u]=a[u];
        }
    }
    
    void mergesort(int a[],int n)
    {
        int s=1;
        int i;
        int *b=(int*)malloc(n*sizeof(int));
        while(s<n)
        {
            onepass(a,b,s,n);
            s=2*s;
            if(s>=n)
            {
                for(i=0;i<n;i++)
                    a[i]=b[i];        
            }
            else
            {
                onepass(b,a,s,n);
                s=2*s;
            }
        }
        free(b);
    }
    void print_array(int array[], int n)  
    {  
        int i;  
        for( i = 0 ; i < n ; ++i )  
            printf("%d ", array[i]);  
        printf("
    ");  
    } 
    
    int main()  
    {  
        int array[] = {-999,1,2,65,90,9,65,78,3};
        mergesort(array,9);
        print_array(array, 9);
        system("pause");
        return 0;
    }

     二路归并排序(2)

    #include <stdlib.h>
    #include <stdio.h>
    
    //合并相邻的两个有序组
    //a[u,...,v-1]和a[v,...,t]
    void merge(int a[],int b[],int u,int v,int t)
    {
        int i,j,k;
        i=u;
        j=v;
        k=u;
        while(i<=v-1&&j<=t)
        {
            if(a[i]<=a[j])
                b[k++]=a[i++];
            else
                b[k++]=a[j++];
        }
        while(i<=v-1)
        {
            b[k++]=a[i++];
        }
        while(j<=t)
        {
            b[k++]=a[j++];
        }
    }
    
    
    void onepass(int a[],int b[],int s,int n)
    {    
        int u,v,t;
        u=0;
        v=s;
        t=2*s-1;
        while(n-u>=2*s)
        {
            merge(a,b,u,v,t);
            u+=2*s;
            v+=2*s;
            t+=2*s;
        }
        if(n-u>s)
            merge(a,b,u,v,n-1);
        else
        {
            for(;u<n;u++)
                b[u]=a[u];
        }
    }
    
    void mergesort(int a[],int n)
    {
        int s;
        int i;
        int *b=(int*)malloc(n*sizeof(int));
        for(s=1;s<n;s=2*s)
        {
            onepass(a,b,s,n);
            s=2*s;
            if(s>=n)
            {
                for(i=0;i<n;i++)
                    a[i]=b[i];
            }
            else
                onepass(b,a,s,n);
        }
    }
    void print_array(int array[], int n)  
    {  
        int i;  
        for( i = 0 ; i < n ; ++i )  
            printf("%d ", array[i]);  
        printf("
    ");  
    } 
    
    int main()  
    {  
        int array[] = {-999,1,2,65,90,9,65,78,3};
        mergesort(array,9);
        print_array(array, 9);
        system("pause");
        return 0;
    }

     四、冒泡排序

    #include <stdlib.h>
    #include <stdio.h>
    
    void bubblesort(int a[],int n)
    {
        int i,j;
        int chage=1;
        int temp;
        for(i=n-1;chage&&i>0;i--)
        {
            chage=0;
            for(j=0;j<i;j++)
            {
                if(a[j]>a[j+1])
                {
                    temp=a[j];
                    a[j]=a[j+1];
                    a[j+1]=temp;
                    chage=1;
                }
            }
        }
    }
    
    void print_array(int array[], int n)  
    {  
        int i;  
        for( i = 0 ; i < n ; ++i )  
            printf("%d ", array[i]);  
        printf("
    ");  
    } 
    
    int main()  
    {  
        int array[] = {-999,1,2,65,90,9,65,78,3};
        bubblesort(array,9);
        print_array(array, 9);
        system("pause");
        return 0;
    }

     五、直接选择排序

    #include <stdlib.h>
    #include <stdio.h>
    
    void selectsort(int a[],int n)
    {
        int i,j;
        int k,max;   //记录最大值下标和最大值
        for(i=n-1;i>=1;i--)
        {
            k=i;
            max=a[i];
            for(j=0;j<i;j++)
            {
                if(a[j]>max)
                {
                    max=a[j];
                    k=j;
                }
            }
            a[k]=a[i];
            a[i]=max;
        }
    }
    
    void print_array(int array[], int n)  
    {  
        int i;  
        for( i = 0 ; i < n ; ++i )  
            printf("%d ", array[i]);  
        printf("
    ");  
    } 
    
    int main()  
    {  
        int array[] = {-999,1,2,65,90,9,65,78,3};
        selectsort(array,9);
        print_array(array, 9);
        system("pause");
        return 0;
    }
  • 相关阅读:
    AtCoder ABC 129F Takahashi's Basics in Education and Learning
    AtCoder ABC 129E Sum Equals Xor
    UVA 511 Do You Know the Way to San Jose?
    UVA 12504 Updating a Dictionary
    [Poi2000] 病毒
    [loj10061] 最短母串
    [Poi2010] Antisymmetry
    校内集训20181003
    校内集训20181001
    校内集训20180925
  • 原文地址:https://www.cnblogs.com/nilongqibu/p/3643768.html
Copyright © 2020-2023  润新知