鍵索引計數法 是LSD MSD算法的基礎
背景
比如一個班級的學生成績分為 1,2,3,4 4個等級
這樣我們就得到一個鍵值關系(組號和姓名)
我們希望根據等級排序
想得到的結果就是 一個數組(按照 1等級的學生緊跟2等級的然后是3等級的最后是4等級),也就是每個等級的學生會連續在一起存到數組中
思路
計算每個組別的頻率,然后轉化為索引(后面的值是前面小鍵頻率的和)
然后就可以知道各個組別的起始索引
注意
- 頻率統計的時候 count索引對應是 組別+1
- 數據分類
count數組中存的是起始索引
aux數組中存的是全部的學生數據
當取到組別的值為x, 則aux[x]的值需要是 x組別 的student對象 然后count中存的對應組別+1的值加1,這樣下一個該組別的student就會放入下一個aux[]數組
public class Student{
private int group;//組號
private String name;//名字
public int getGroup() {
return group;
}
public void setGroup(int group) {
this.group = group;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Student(int group, String name){
this.name = name;
this.group = group;
}
public Student(){}
}
@Test
public void test(){
sort();
}
public void sort(){
Student[] a = new Student[5];
a[0] = new Student(1, "sun1");
a[1] = new Student(2, "sun2");
a[2] = new Student(3, "sun3");
a[3] = new Student(1, "sun1");
a[4] = new Student(4, "sun4");
int N = a.length;
int R = 5;
Student[] aux = new Student[N];
int[] count = new int[R + 1];
//計算頻率
for (int i = 0; i < N; i++) {
count[a[i].getGroup() + 1]++;
}
//頻率轉索引 前面的小鍵相加
for (int r = 0; r < R; r++) {
count[r + 1] += count[r];
}
//元素分類 劃分按組別(鍵)
for (int i = 0; i < N; i++) {
aux[count[a[i].getGroup()]++] = a[i];
// aux[count[a[i].getGroup()]] = a[i];
// count[a[i].getGroup()]++;
}
for (int i = 0; i < N; i++) {
a[i] = aux[i];
}
}