学习算法-基数排序(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 |
第一趟排序依照个位数相应排序。第二趟依照十位数。一个桶里能放下多个数。
所以要二维数组。也能够用链表来实现。
后面假设写了我再放这里。
以下放代码:
// // 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长时间~
版权声明:本文博客原创文章。博客,未经同意,不得转载。