package chapter1;
public class Ranksort {
/**
* 求秩排序
* @param args
*/
/**
* 求秩函数
* 一个序列中的元素的秩(rank)是序列中较小元素的数量加上出现在
* 其左侧的相等元素的数量
*/
public static void rank(int[] a, int[] r) {
if (r.length < a.length) {
throw new IllegalArgumentException("length of rank array cannot be "+
"less than the number of objects");
}
for (int i = 0; i < a.length; i++) {
r[i] = 0;
}
for (int i = 1; i < a.length; i++) {
for (int j = 0; j < i; j++) {
if (a[j] <= a[i]) {
r[i]++;
} else {
r[j]++;
}
}
}
}
/**
* 秩的排序
* @param args
*/
public static void rearrange(int[] a, int[] r) {
int[] u = new int[a.length];
for (int i = 0; i < a.length; i++) {
u[r[i]] = a[i];
}
for (int i = 0; i < a.length; i++) {
a[i] = u[i];
}
}
public static void main(String[] args) {
int a[] = {4, 3, 9, 3, 7};
int r[] = new int[5];
rank(a, r);
for (int i : r) {
System.out.print(i + " ");
}
System.out.println();
rearrange(a, r);
for (int l : a) {
System.out.print(l + " ");
}
}
}