算法学习-基数排序(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, '\0', 10*N*sizeof(int));
    for (k = 0; k < N; k++) {
        remainder = (A[k]/(int)pow(10, times))%10;
        while (tmp[remainder][h] != '\0') {
            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] != '\0') {
                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",N);
    RadixSort(A, Max, N);
//    printf("%d\n",(int)pow(10, 0));
    for (i = 0; i < N; i++) {
        printf("%d ",A[i]);
    }
    printf("\n");
    return 0;
}

中间犯了一个错误,Matlab下的10的0次幂是10^0顺手也给写成这个了,中间调bug半天~

时间: 2024-08-08 08:42:25

算法学习-基数排序(radix sort)卡片排序(card sort) C++数组实现的相关文章

经典排序算法学习笔记五——直接选择排序

一.直接选择排序 数据结构 数组 最差时间复杂度 O(n^2) 最优时间复杂度 O(n^2) 平均时间复杂度 O(n^2) 最差空间复杂度 О(n) total, O(1) auxiliary 1.算法思想: 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置. 然后,再从剩余未排序元素中继续寻找最小(大)元素,放到已排序序列的末尾. 以此类推,直到所有元素均排序完毕. 2.伪代码: repeat (numOfElements - 1) times set the first uns

【算法学习笔记】46.拓扑排序 优先队列 SJTU OJ 3010 Complicated Buttons

Description 凯恩在遗迹探险时遇到了n个按钮,刚开始所有按钮都处于开状态,凯恩的经验告诉他把所有按钮都关上会有“好事”发生,可是有些按钮按下时会让其他一些已经闭合的按钮弹开,经过凯恩研究,每个按钮都对应着一个固定的弹开集合,这个按钮按下时,弹开集合中所有的按钮都会变为开状态.现在小k想知道是否能让所有的按钮变为闭状态.如果能,打印最少步数以及方案,否则,打印“no solution”. Input Format 第一行一个整数n,表示n个按钮. 接下来n行,表示编号为1到n个按钮的弹开

经典排序算法 - 希尔排序Shell sort

经典排序算法 - 希尔排序Shell sort 希尔排序Shell Sort是基于插入排序的一种改进,同样分成两部分, 第一部分,希尔排序介绍 第二部分,如何选取关键字,选取关键字是希尔排序的关键 第一块希尔排序介绍 准备待排数组[6 2 4 1 5 9] 首先需要选取关键字,例如关键是3和1(第一步分成三组,第二步分成一组),那么待排数组分成了以下三个虚拟组: [6 1]一组 [2 5]二组 [4 9]三组 看仔细啊,不是临近的两个数字分组,而是3(分成了三组)的倍数的数字分成了一组, 就是每

经典排序算法 - 基数排序Radix sort

经典排序算法 - 基数排序Radix sort 原理类似桶排序,这里总是需要10个桶,多次使用 首先以个位数的值进行装桶,即个位数为1则放入1号桶,为9则放入9号桶,暂时忽视十位数 例如 待排序数组[62,14,59,88,16]简单点五个数字 分配10个桶,桶编号为0-9,以个位数数字为桶编号依次入桶,变成下边这样 |  0  |  0  | 62 |  0  | 14 |  0  | 16 |  0  |  88 | 59 | |  0  |  1  |  2  |  3  |  4 | 

算法学习-02(希尔排序,计数排序,桶排序,基数排序)

希尔排序 # 希尔排序 # 希尔排序是对插入排序的升级改造 # 它的大致流程是 # 1.将长度为n的序列 分为d = n//2组 # 2.使每一组变的有序 # 3.将序列分为 d1 = d // 2 组 # 4.将每一组变的有序 # 5.直到最后 d 小于等于 0 def inster_sort_gap(li,gap): for i in range(gap,len(li)): tmp = li[i] j = i - gap while j >= 0 and tmp > li[j]: li[j

桶排序/基数排序(Radix Sort)

说基数排序之前,我们先说桶排序: 基本思想:是将阵列分到有限数量的桶子里.每个桶子再个别排序(有可能再使用别的排序算法或是以递回方式继续使用桶排序进行排序).桶排序是鸽巢排序的一种归纳结果.当要被排序的阵列内的数值是均匀分配的时候,桶排序使用线性时间(Θ(n)).但桶排序并不是 比较排序,他不受到 O(n log n) 下限的影响.          简单来说,就是把数据分组,放在一个个的桶中,然后对每个桶里面的在进行排序. 例如要对大小为[1..1000]范围内的n个整数A[1..n]排序 首

算法学习 - STL的p排序函数(sort)使用

排序函数sort() 这个函数是STL自带的,功能很强大~ 这里教下使用方法. sort()有三个参数,第一个是排序的起始位置,第二个是排序的结束位置,第三个是排序的判断函数.函数原型为: sort(<#_RandomAccessIterator __first#>, <#_RandomAccessIterator __last#>, <#_Compare __comp#>) 这个就是原型了~ 使用方法 首先假设我们有一个vector<int> vec;向量

常见的排序算法(四)( 归并排序,计数排序 , 基数排序)

 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.将已有序的子序列合并,得到完全有序的序列:即先使每个子序列有序,再使子序列段间有序.若将两个有序表合并成一个有序表,称为二路归并. (如果读者不太了解什么叫分治法,可以去看看<算法导论>第一二章.) 归并过程为:比较a[i]和a[j]的大小,若a[i]≤a[j],则将第一个有序表中的元素a[i]复制到r[k]中,并令i和k分别加上1:否则将第

排序算法系列——基数排序

基数排序不同于其他的七种排序算法,它是基于一种分配法,而非比较.基数排序属于"分配式排序"(distribution sort),基数排序法又称"桶子法"(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些"桶"中,藉以达到排序的作用.它的灵感来自于队列(Queue),它最独特的地方在于利用了数字的有穷性(阿拉伯数字只有0到9的10个). 基本思想: 我们考虑对整数进行基数排序的过程,对于整数,