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个队列。很多书上有,不在此赘述。

  • 相关阅读:
    将一个数组分割为固定大小为三的的数组的数组
    计算两个日期间的天数
    手机号码影藏中间四位
    (反射)获取类的Class文件的三种方式
    Java程序员必背单词
    文本处理(CSS,JS)
    java学习路线
    onLoad onShow
    过滤HTML标签
    uni-app手机横屏后界面错乱解决办法
  • 原文地址:https://www.cnblogs.com/qiangua/p/3705130.html
Copyright © 2011-2022 走看看