最も速いアルゴリズムで再帰する必要はありません!運行時間はリニアです!
カウントアルゴリズムについて説明します.
このアルゴリズムの実行時間は線形です!これはとても珍しいですね.したがって、最も速いアルゴリズムの列に帰すべきであり、再帰が使用されていないため、システムのリソース占有も大きくないが、元のアドレスソートに属していないが、安定しているという欠点がある.すなわち、出力順序は入力順序に厳格に従い、同じ要素であっても!基数ソートでよく使用されます.以下の内容は「アルゴリズム導論」のカウント順から抜粋した基本思想である.
各入力要素xについて、xより小さい要素の個数を決定する.この情報を利用すると,xを出力配列中の位置に直接置くことができる.例えば、17個の要素がxより小さい場合、xは18番目の出力位置にあるべきである.いくつかの要素が同時に存在する場合、このスキームは依然として成立する.
次に、C言語バージョンの例を示します.
このアルゴリズムの実行時間は線形です!これはとても珍しいですね.したがって、最も速いアルゴリズムの列に帰すべきであり、再帰が使用されていないため、システムのリソース占有も大きくないが、元のアドレスソートに属していないが、安定しているという欠点がある.すなわち、出力順序は入力順序に厳格に従い、同じ要素であっても!基数ソートでよく使用されます.以下の内容は「アルゴリズム導論」のカウント順から抜粋した基本思想である.
各入力要素xについて、xより小さい要素の個数を決定する.この情報を利用すると,xを出力配列中の位置に直接置くことができる.例えば、17個の要素がxより小さい場合、xは18番目の出力位置にあるべきである.いくつかの要素が同時に存在する場合、このスキームは依然として成立する.
次に、C言語バージョンの例を示します.
/*
M ,
N
:
, 14 ,
15 ,
*/
#include "stdio.h"
#include "conio.h"
#include "string.h"
#define M 8
#define N 10
/* , :n , ,
,
k */
void count_sort(int A[],int B[])
{
int c[M+1];
int i=0;
for(i=0;i<=M;i++) /* c[] 0*/
{
c[i]=0;
}
for(i=0;i<N;i++)
{
c[A[i]]=c[A[i]]+1;
}
for(i=1;i<=M;i++) /* i */
c[i]=c[i]+c[i-1];
for(i=N-1;i>=0;i--)
{
B[c[A[i]]]=A[i];
c[A[i]]--;
}
}
main()
{
int a[N]={2,5,4,3,0,2,8,1,6,7},b[N+1],i;
count_sort(a,b);
printf("
");
for(i=1;i<=N;i++) /*0 !*/
printf(" %d ",b[i]);
getch();
}