您的位置:首页 > 其它

【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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: