zoukankan      html  css  js  c++  java
  • 排序算法实例

    前三章都讲解了三种排序算法---------桶排序、冒泡排序、快速排序,本文就来运用这些算法牛刀小试一波。

    一、问题描述

    输入有两行,第一行为一个正整数n,接着第二行输入n个数字(当然n个数字之间有间隔,不能连载一起),这个n个数字可以有重复的

    输出有两行,第一行输出这k个数字排序, 第二行统计输入n个数字共有k个不同的数字(即 k<=n)。

    示例:

    输入:
    
    10
    20 40 32 67 40 20 89 300 400 15
    
    输出:
    
    15 20 32 40 67 89 300 400
    8

    二、代码示例及分析

    2.1 桶排序

    #include<stdio.h>
    #define N 1001
    
    // 此程序采用桶排序  先去重在排序 
    
    void init(int array[])
    {
        int i;
        for(i=0;i<N;++i)
            array[i] = 0;
    }
    
    int main()
    {
        int array[N];    // 对于数字较小的话 可以采用这种方法      
        int i,t,n,k;
        
        while(scanf("%d",&n)!=EOF)
        {
            
            init(array);
            k=0;
            
            for(i=0;i<n;++i)
            {
                scanf("%d",&t);
                array[t] = 1;
            }
            printf("
    
    --------输出结果为-------
    
    ");
            for(i=0;i<N;++i)
            {
                if(array[i]==1)  // 如果数字出现过则打印
                {
                    k++;
                    printf("%d	",i);
                }
                
            }
            printf("
    %d
    ",k);
             
        }
        return 0;
    }

    时间复杂度大约为O(N+M),效率较高,但是缺点也很明显,数组不可能很大,对输入的数字要求有限制,针对浮点数或大数字的时候,此算法不合适

    2.2 冒泡排序

    #include<stdio.h>
    #define N 101
    
    // 采用冒泡排序  先排序再去重 
    
    int main()
    {
        int n,a[N];
        int i,j,len,temp,k;
        
        while(scanf("%d",&n)!=EOF)
        {
            for(i=0;i<n;++i)
                scanf("%d",&a[i]);
            k = 0;
            // bubble sort (From small to big)
            len = n;
            while(--len)
            {
                for(j=0;j<len;++j)
                {
                    if(a[j]>a[j+1])
                    {
                        temp = a[j];
                        a[j] = a[j+1];
                        a[j+1] = temp;
                    }
                }    
            }
            
            //  去重 ,先输出第一个数 
            printf("
    %d	",a[0]);
            for(i=1;i<n;++i)
            {
                if(a[i-1]!=a[i])
                {
                    printf("%d	",a[i]);
                    k++;
                }
            } 
        
            printf("
    %d
    ",k+1); // 带上第一个输出的    
        }    
        return 0;
    }

    时间复杂度O(N^2)   当对大量数据排序时  此算法的时间效率太低了,可以采用快速排序

    2.3 快速排序

    #include<stdio.h> 
    #include<string.h>
    #define N 100
     
    void quickSort(int array[],int left,int right)
    { 
        int i = left;
        int j = right;
        int value = array[left],temp;    // 得到哨兵元素
        // 异常处理,保证right >= left 
        if(left>right)
            return;
        
        while(i < j)
        {
            // 从右向左找一个比基准数小的 
            while(value<=array[j] && i<j) j--;
            // 从左到右找一个比基数大的
            while(value>=array[i] && i<j)  i++;
            // 当i,j没相遇时  交换两者位置
            if(i < j)
            {
                temp = array[j];
                array[j] = array[i];
                array[i] = temp;
            }
            
        }    
        // 最终基准归位 
        if(i == j)
        {
            array[left] = array[i];
            array[i] = value;
        } 
        
        // 递归调用基准数划分的左右两组序列
        quickSort(array,left,i-1);
        quickSort(array,i+1,right); 
        
    }
    
    int main()
    {
        int n,k=0,i,array[N]; // n表示要输入排序元素的个数
        scanf("%d",&n);
        for(i=0;i<n;++i)
        {
            scanf("%d",&array[i]);
        } 
        
        // 调用排序函数
        quickSort(array,0,n-1);
        
        //  去重 ,先输出第一个数 
        printf("
    %d	",array[0]);
        for(i=1;i<n;++i)
        {
            if(array[i-1]!=array[i])
            {
                printf("%d	",array[i]);
                k++;
            }
        } 
        printf("
    %d
    ",k+1); // 带上第一个输出的     
        
        return 0;
    }

    时间复杂度O(nlogn)   针对大量数字时,此算法的优势会明显提升

     以上三个算法的 示例代码运行的结果 如下所示:

     -----------------------------------------------------------------------------------------------------------------------------------------------

    以上就是对这三种排序算法的总结,针对不同情况适当的选取,没有哪种算法是最好的,只有在特定的情况下,适当的选取,会让你的程序更有效率

      

  • 相关阅读:
    scrapy中selenium的应用
    Django的锁和事务
    redis
    【leetcode】187. Repeated DNA Sequences
    【leetcode】688. Knight Probability in Chessboard
    【leetcode】576. Out of Boundary Paths
    【leetcode】947. Most Stones Removed with Same Row or Column
    【leetcode】948. Bag of Tokens
    【leetcode】946. Validate Stack Sequences
    【leetcode】945. Minimum Increment to Make Array Unique
  • 原文地址:https://www.cnblogs.com/guohaoblog/p/9211638.html
Copyright © 2011-2022 走看看