【WEISS算法书】MSD基数排序
2009-05-30 16:23
357 查看
看到了基数排序。。
LSD还好理解和实现。。
MSD就稍微麻烦一点。。。
用到了递归。。。
不过学了汇编。。对递归也理解得更好了。。
继续继续。。
Code:
#include "stdafx.h"
#include "stdio.h"
void LSD(int data[],int digit)
{
int temp[10][10] = {0};
int order[10] = {0};
int i, j, k, n, lsd;
k = 0;
n = 1;
/*printf("/n排序前: ");
for(i = 0; i < 10; i++)
printf("%d ", data[i]);
putchar('/n');
*/
while(n <=digit) {
for(i = 0; i < 10; i++) {
lsd = ((data[i] / n) % 10);
temp[lsd][order[lsd]] = data[i];
order[lsd]++;
}
printf("/n重新排列: ");
for(i = 0; i < 10; i++) {
if(order[i] != 0)
for(j = 0; j < order[i]; j++) {
data[k] = temp[i][j];
printf("%d ", data[k]);
k++;
}
order[i] = 0;
}
n *= 10;
k = 0;
}
putchar('/n');
printf("/n排序后: ");
for(i = 0; i < 10; i++)
printf("%d ", data[i]);
}
void MSD(int data[],int size,int digit)
{
if(digit<1)
{
return;
}
if(size==0 || size==1)
{
return;
}
if(size==2)
{
if(data[1]<data[0])
{
int temp=data[0];
data[0]=data[1];
data[1]=temp;
}
return;
}
int temp[10][10] = {0};
int order[10] = {0};
int n=digit;
int msd,i,j,k;
for(i = 0; i < size; i++)
{
msd = ((data[i] / n) % 10);
temp[msd][order[msd]] = data[i];
order[msd]++;
}
for(i=0;i<10;i++)
{
MSD(temp[i],order[i],digit/10);
}
k=0;
for(i = 0; i < 10; i++) {
if(order[i] != 0)
{
for(j = 0; j < order[i]; j++) {
data[k] = temp[i][j];
k++;
}
}
order[i] = 0;
}
}
int data1[10] = {273, 822, 355, 358, 271, 716, 928, 365, 359, 272};
int main(void) {
MSD(data1,sizeof(data1)/sizeof(data1[0]),100);
for(int i=0;i<sizeof(data1)/sizeof(data1[0]);i++)
{
printf("%d ",data1[i]);
}
return 0;
}
LSD还好理解和实现。。
MSD就稍微麻烦一点。。。
用到了递归。。。
不过学了汇编。。对递归也理解得更好了。。
继续继续。。
Code:
#include "stdafx.h"
#include "stdio.h"
void LSD(int data[],int digit)
{
int temp[10][10] = {0};
int order[10] = {0};
int i, j, k, n, lsd;
k = 0;
n = 1;
/*printf("/n排序前: ");
for(i = 0; i < 10; i++)
printf("%d ", data[i]);
putchar('/n');
*/
while(n <=digit) {
for(i = 0; i < 10; i++) {
lsd = ((data[i] / n) % 10);
temp[lsd][order[lsd]] = data[i];
order[lsd]++;
}
printf("/n重新排列: ");
for(i = 0; i < 10; i++) {
if(order[i] != 0)
for(j = 0; j < order[i]; j++) {
data[k] = temp[i][j];
printf("%d ", data[k]);
k++;
}
order[i] = 0;
}
n *= 10;
k = 0;
}
putchar('/n');
printf("/n排序后: ");
for(i = 0; i < 10; i++)
printf("%d ", data[i]);
}
void MSD(int data[],int size,int digit)
{
if(digit<1)
{
return;
}
if(size==0 || size==1)
{
return;
}
if(size==2)
{
if(data[1]<data[0])
{
int temp=data[0];
data[0]=data[1];
data[1]=temp;
}
return;
}
int temp[10][10] = {0};
int order[10] = {0};
int n=digit;
int msd,i,j,k;
for(i = 0; i < size; i++)
{
msd = ((data[i] / n) % 10);
temp[msd][order[msd]] = data[i];
order[msd]++;
}
for(i=0;i<10;i++)
{
MSD(temp[i],order[i],digit/10);
}
k=0;
for(i = 0; i < 10; i++) {
if(order[i] != 0)
{
for(j = 0; j < order[i]; j++) {
data[k] = temp[i][j];
k++;
}
}
order[i] = 0;
}
}
int data1[10] = {273, 822, 355, 358, 271, 716, 928, 365, 359, 272};
int main(void) {
MSD(data1,sizeof(data1)/sizeof(data1[0]),100);
for(int i=0;i<sizeof(data1)/sizeof(data1[0]);i++)
{
printf("%d ",data1[i]);
}
return 0;
}
相关文章推荐
- 算法记录:MSD基数排序 + qsort 对字符串排序
- 算法(5)基数排序
- 数据结构-算法: 分配排序(基数分配排序法)
- python算法学习之基数排序实例
- msd基数排序
- [算法] 关于algs4 MSD.java 高位优先的字符串排序 的逐行代码解释
- 第十六周项目1-(8)验证算法基数排序
- java必须知道的八大种排序算法:冒泡排序、 选择排序、插入排序、快速排序、希尔算法、归并排序算法、基数排序、堆排序算法
- 第16周项目1-验证算法(8)基数排序
- Java排序算法以及算法改进总结(计数排序、基数排序、桶排序)
- 无聊时总结总结算法之09基数排序
- 8大内部排序算法学习笔记--(4)归并、基数排序 Java实现
- 内排序算法之基数排序
- 算法之旅,直奔排序 基数排序
- 采用回调函数的内部排序算法-插入排序,希尔排序,冒泡,快排,堆排,归并排,基数排序
- 第十六周项目1-验证算法(8)基数排序
- 第十五周项目1 验证算法(7)基数排序
- 已完成以下算法:冒泡排序,插入排序,希尔排序,快速排序,基数排序
- 【数据结构与算法基础】单链表及其应用基数排序 / Singly Linked List and radix sort
- 数据结构与算法——计数排序、桶排序、基数排序