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)   针对大量数字时,此算法的优势会明显提升

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

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

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

      

  • 相关阅读:
    财务系统重复付款case分析及解决方案
    MySQL体系结构
    安装篇九:安装wordpress(5.4版本)
    安装篇八:配置 Nginx 使其支持 MySQL 应用
    安装篇七:配置 Nginx 使其支持 PHP 应用
    安装篇六:安装PHP(7.2.29版本)
    安装篇五:安装MySQL(5.6.38版本)
    安装篇四:安装NGINX(1.4.0版本)
    安装篇三:系统初始化设置
    安装篇二:CentOS 6.9系统安装
  • 原文地址:https://www.cnblogs.com/guohaoblog/p/9211638.html
Copyright © 2011-2022 走看看