看到了基数排序。。
LSD还好理解和实现。。
MSD就稍微麻烦一点。。。
用到了递归。。。
不过学了汇编。。对递归也理解得更好了。。
继续继续。。
- #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;
- }