基數排序是首先按最低有效位數字進行排序,以解決卡片排序問題。
重復對所有的d位數字都進行排序,僅需要d遍就可以將一堆卡片進行排序。
這里又運用了基數排序的方法,所以總的時間復雜度為O(n*d)。
#include <stdio.h>
#include 
<stdlib.h>
#include 
<iostream>
#include 
<cmath>
using namespace std;

void CountSort(int a[], int b[],int num,int d)   //計數排序
{
    
int* c = new int[10];
    
int index;
    
for (int i=0;i<=9;i++)
       c[i]
=0;
    
int size = num;
    
for (int j=0;j<size;j++)
    
{
        index
=a[j]%(int)pow(10.0,d)/(int)pow(10.0,d-1);
        c[index]
++;
    }

    
//c[i]包含等于i的元素個數
    for (i=1;i<=9;i++)
       c[i]
=c[i]+c[i-1];
    
//c[i]包含小于等于i的元素個數
    for (j=size-1;j>=0;j--)
    
{
        index
=a[j]%(int)pow(10.0,d)/(int)pow(10.0,d-1);
        b[c[index]
-1]=a[j];
        c[index]
--;
    }


    
for (j=0;j<size;j++)    //更新一次排序后的a數組
    {
        a[j]
=b[j];
    }

        delete [] c;
}


void RadixSort(int a[],int b[],int d,int num)   //基數排序
{
    
for(int i=1;i<=d;i++)
        CountSort(a,b,num,i);
}



void main()
{
    
int num,d;
    cout
<<"輸入個數及位數"<<endl;
    cin
>>num>>d;
    
int* a = new int[num];
    
int* b = new int[num];
    cout
<<"排序前:"<<endl;
    
for(int i=0;i<num;i++)
    
{
        cin
>>a[i];
    }

        
    RadixSort(a,b,d,num);

    cout
<<"排序后:"<<endl;
    
for (int j=0;j<num;j++)
    
{
        cout
<<b[j]<<endl;
    }


    delete [] a;
    delete [] b;
}