• 学习算法-基数排序(radix sort)卡片分类(card sort) C++数组实现


    基数排序称为卡片分类,这是一个比较早的时间越多,排名方法。

    现代计算机出现之前,它已被用于排序老式打孔卡。


    说下基数排序的思想。前面我有写一个桶式排序,基数排序的思想是桶式排序的推广。

    桶式排序:http://blog.csdn.net/alps1992/article/details/38132593

    基数排序的思想是在于仅仅有10个桶。而不是最大数是多少就有多少个桶。假如我们有10个乱序的数字。

    第一趟排序之后

    0 1 512 343 64 125 216 27 8 729
    0 1 2 3 4 5 6 7 8 9
    表格的第二行是10个桶的列表,第一行是10个数字。

    第一趟排序依照个位数相应排序。第二趟依照十位数。一个桶里能放下多个数。

    所以要二维数组。也能够用链表来实现。

    后面假设写了我再放这里。


    以下放代码:

    //
    //  main.cpp
    //  RadixSort
    //
    //  Created by Alps on 14-7-26.
    //  Copyright (c) 2014年 chen. All rights reserved.
    //
    
    #include <iostream>
    #include "cmath"
    
    using namespace std;
    
    int LoopTimes(int Num){
        int times = 0;
        
        while (Num) {
            Num = Num/10;
            times++;
        }
        
        return times;
    }
    
    void Sort(int *A, int times, int N);
    
    void RadixSort(int * A, int Max, int N){
        int i = 0;
        int times = LoopTimes(Max);
        for (i = 0; i < times; i ++) {
            Sort(A, i, N);
        }
    }
    
    void Sort(int *A, int times, int N){
        int i = 0,k = 0,h = 0,j = 0;
        int remainder;
        int tmp[10][N];
        memset(tmp, '', 10*N*sizeof(int));
        for (k = 0; k < N; k++) {
            remainder = (A[k]/(int)pow(10, times))%10;
            while (tmp[remainder][h] != '') {
                h++;
            }
            tmp[remainder][h] = A[k];
            h = 0;
        }
        h = 0;
        for (i = 0; i < 10; i++) {
            for (j = 0; j < N; j++) {
                if (tmp[i][j] != '') {
                    A[h] = tmp[i][j];
                    h++;
                }
            }
        }
    }
    
    
    
    int main(int argc, const char * argv[])
    {
    
        int A[]={4, 2, 6, 1, 13, 532, 67, 134, 132, 543};
        int N = sizeof(A)/sizeof(int);
        int Max = 543;
        int i = 0;
    //    printf("%d
    ",N);
        RadixSort(A, Max, N);
    //    printf("%d
    ",(int)pow(10, 0));
        for (i = 0; i < N; i++) {
            printf("%d ",A[i]);
        }
        printf("
    ");
        return 0;
    }
    

    中间犯了一个错误,Matlab下的10的0功率10^0顺手也给了写这,中间调bug长时间~

    版权声明:本文博客原创文章。博客,未经同意,不得转载。

  • 相关阅读:
    利用python求非线性方程
    迪士尼穷游攻略
    爬虫八之爬取京东商品信息
    爬虫七之分析Ajax请求并爬取今日头条
    爬虫五之Selenium
    爬虫4之pyquery
    前端传入 SQL 语句 到后端执行
    手写分页处理
    集合(Map,List)分组:多属性进行分组
    java 枚举类非常好的运用实例
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4740637.html
Copyright © 2020-2023  润新知