單關鍵字基數排序
步驟: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...