zoukankan      html  css  js  c++  java
  • 快速排序&基数排序

    //快速排序
    #include<stdio.h>
    
    void QuickSort(int R[],int low,int high)
    {
        int i=low,j=high;
        int pivot;
        if(low<high)
        {
            pivot=R[i];
            while(i!=j)
            {
                while(i!=j && R[j]>pivot)
                    j--;
                R[i]=R[j];
                while(i!=j && R[i]<pivot)
                    i++;
                R[j]=R[i];
            }
            R[i]=pivot;
            QuickSort(R,low,i-1);
            QuickSort(R,j+1,high);
        }
    
    }
    
    int main()
    {
        int a[10]={0,1,7,2,5,4,3,6,8,9};
        int i;
        printf("原    :");
        for(i=0;i<10;i++)
            printf("%d ",a[i]);
        printf("
    排序后:");
        QuickSort(a,0,9);
        for(i=0;i<10;i++)
            printf("%d ",a[i]);
        return 0;
    }
    //快速排序中用到递归,递归实质是一个循环
    /*
    while(条件)  //条件=递归出口
    {
        function(变化的参数);
    }
    */
    //递归的思想是异级同构

    //基数排序
    #include<stdio.h>
    // 乾卦
    // 2014-5-3 
    //获取数字的十位数
    int get_ten(int n)
    {
        return(n/10);
    
    }
    //获取数字的个位数
    int get_single(int n)
    {
        return (n%10);
    }
    int main()
    {
        int arr[10][10]={0};   //存储索引,相同的数字最大存10个
        int ind_arr[10]={0};           //每行的存储长度
        int R[10]={12,21,13,98,91,94,42,32,56,79};
        int i,j,index;
        int k;
        //按个位数排序
        for(i=0;i<10;i++)
        {
            index=get_single(R[i]);    //获取每个数字的个位数
            arr[index][ind_arr[index]]=i;     //存储在R中的索引
            ind_arr[index]++;
        }
        //我们看看按照个位数排序后的输出
        printf("按照个位数排序:
    ");
        for(i=0;i<10;i++)              
        {
            for(j=0;j<ind_arr[i];j++)    //先输出行
            {
                printf("%d ",R[arr[i][j]]);
            }
        }
        printf("
    ");
        //遍历,整个数组然后从十位数最小的开始输出
        for(i=0;i<10;i++)                 //遍历10次
        {
            for(j=0;j<10;j++)
            {
                for(k=0;k<ind_arr[j];k++)
                {
                    if(i==get_ten(R[arr[j][k]]))
                        printf("%d ",R[arr[j][k]]);
    
                }
                
            }
    
        }
        return 0;
    }

    可以用图表示上面的排序,跟前几篇的桶排序有相似的地方:

    最上层的是arr数组的列索引,最左侧是arr数组的行索引,最右侧的是每行存储了多少个数,也就是ind_arr的值。

    有黑色边框的表格里面的值的x:xx ,x代表数组R中的索引值,xx则是R[x]。

    然后我们从头开始按顺序遍历10次(说遍历有点牵强,应该说遍历arr数组内值不为0的),

    每次取十位数值与遍历号相同的值输出。

    此方法效率巨低。

    那么我们可以考虑用空间换时间的方法。

    //遍历,整个数组然后从十位数最小的开始输出
            for(j=0;j<10;j++)
            {
                for(k=0;k<ind_arr[j];k++)
                {
                    //一共10个队列queue[x]
                    queue[get_ten(R[arr[j][k]])].enQueue(R[arr[j][k]]);
                        
                }            
            }

    我们一开始就可以用到这10个队列。很多书上有,不在此赘述。

  • 相关阅读:
    什么是Referer?Referer的作用?空Referer是怎么回事?
    http状态码301和302详解及区别——辛酸的探索之路
    linux下redis的安装、启动、关闭和卸载
    Ubuntu下的redis安装过程
    apt-get build-dep命令详解
    apt 和 apt-get的区别
    Cortex-M3 入门指南(三):时钟总线与复位时钟控制器
    objdump命令解析
    ubuntu gcc 安装 使用
    你知道 GNU Binutils 吗?【binutils】
  • 原文地址:https://www.cnblogs.com/qiangua/p/3705130.html
Copyright © 2011-2022 走看看