基數排序的若干種方法

2021-07-09 02:33:49 字數 1533 閱讀 7763

單關鍵字基數排序

步驟:1.統計陣列中每個值為i的元素出現的次數,存入陣列c的第i項;

2.對所有的計數累加(從c中的第乙個元素開始,每一項和前一項相加);

3.反向填充目標陣列:將每個元素i放在新陣列的第c[i]項,每放乙個元素就將c[i]減去1.

#include#include#include#define num_range (26)

void print_arr(int *arr, int n)

free(count_arr);

}int main()

}int main()

方法二:

步驟:1.按照單關鍵字基數排序來將第二關鍵字排序

2.按照第二關鍵字的大小順序來記錄相應的第一關鍵字的位置

3.按照由2.得到的第一關鍵字順序來進行基數排序

4.按照第一關鍵字的大小順序輸出第一關鍵字和第二關鍵字

#include#includeconst int maxn = 1000;

const int maxvalue = 2000;

void jishu_sort(int *a, int *b, int n)

if(b==null)

if(n<=0)

//sa[i]表示排第i的是誰

int sa[maxn], //第二關鍵字中第i大的數的位置

sa1[maxn]; //第一關鍵字中第i大的數的位置

memset(sa,0,sizeof(sa));

memset(sa1,0,sizeof(sa1));

int i;

int cnt[maxvalue];

//對第二關鍵字排序

memset(cnt, 0, sizeof(cnt));

for(i=1; i<=n; i++)

cnt[b[i]]++;

for(i=1; i<=maxvalue; i++)

cnt[i]+=cnt[i-1];

for(i=n; i>=1; i--)

sa[cnt[b[i]]--]=i;

//對第一關鍵字排序

memset(cnt, 0, sizeof(cnt));

for(i=1; i<=n; i++)

cnt[a[sa[i]]]++;

for(i=1; i<=maxvalue; i++)

cnt[i]+=cnt[i-1];

for(i=n; i>=1; i--)

//輸出排序後的結果

for(i=1; i<=n; i++)

printf("%d %d\n", a[sa1[i]], b[sa1[i]]);

}int main()

} //基數排序

jishu_sort(a, b, n);

return 0;

}

比較:方法一比較易懂,但是占用空間比較多;

而方法二在時間和空間上都比較優秀,而且此方法可應用於字尾陣列。

排序方法(8) 基數排序

參考 基數排序 radix sort 屬於 分配式排序 distribution sort 又稱 桶子法 bucket sort 或bin sort,顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些 桶 中,藉以達到排序的作用,基數排序法是屬於穩定性的排序,其時間複雜度為o nlog r ...

排序方法9 基數排序

include include include define maxe 20 線性表中最多元素個數 define maxr 10 基數的最大取值 typedef struct node nodetype void createlist nodetype p,int a,int n else t ne...

排序 基數排序

基數排序 radix sort 是屬於 分配式排序 distribution sort 基數排序法又稱 桶子法 bucket sort 或bin sort,顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些 桶 中,藉以達到排序的作用。排序思想 首先按照資料的最低位 個位 將資料分配到0 9...