珠排序算法
我们都是看过算盘的,每当播完算盘时,都会将算盘立起来复原算盘。珠算法的原理跟算盘立起的动作相关。
- 将数组的数字转换为每行的珠的个数。
- 将每行的珠子都用签子串起来。
- 此时立起所有的签子,会自动的将珠进行排序。
例如下图:当立起签子时,上方6的珠子会往下方落。
import java.util.*;
public class Test {
public static void main(String[] args) {
int[] arr= {3,7,1,9,8,5,4,6,10,2};
System.out.println("排序前:"+ Arrays.toString(arr));
int[] sort = Test.beadSort(arr);
System.out.println("排序后:"+ Arrays.toString(sort));
}
//珠排序
public static int[] beadSort(int[] arr) {
int max=0;
for(int i=0;i<arr.length;i++){
if(arr[i]>max) {
max = arr[i];
}
}
//初始化签子
char[][] grid=new char[arr.length][max];
int[] count=new int[max];
for(int i=0;i<max;i++) {
count[i]=0;
for(int j=0;j<arr.length;j++) {
grid[j][i] = '_';
}
}
//签子立起来
for(int i=0;i<arr.length;i++) {
int num=arr[i];
for(int j=0;num>0;j++) {
grid[count[j]++][j]='*';
num--;
}
}
System.out.println();
outPrint(grid);
System.out.println();
//数珠子
int[] sorted=new int[arr.length];
for(int i=0;i<arr.length;i++) {
int putt=0;
for(int j=0;j<max&&grid[arr.length-1-i][j]=='*';j++) {
putt++;
}
sorted[i]=putt;
}
return sorted;
}
public static void outPrint(char[][] arr) {
for(int i=0;i<arr.length;i++) {
for (int j = 0; j < arr[i].length; j++){
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
}
}
运行结果: