1、桶排序: 桶排序适用于对一些少量的数据进行排序,思路是确立一个上限值M,该M值应大于待排序数组中所有的值。然后设置M数量的带序号的桶,之后依次从待排序数组中读取数据并将该数字装入序号为该数数值大小的桶中,最后按照桶的序号依次取出桶中的数据即为已经排好顺序的数据。该算法用时为O(M+N)。
package bucketSort;
import java.util.ArrayList;
public class BucketSort {//桶排序
public static void main(String[] args) {
int[] num={8,6,7,5,1,3,9,6};
int[] result=new int[num.length];//存储结果集
bucketSort(num, 10,result );
for (int r:result)
System.out.print(r+" ");
}
//桶排序,传入参数:待排序数组,数组中数值上限,接收输出数组
public static void bucketSort(int[] tag,int Uplimit,int[] result)
{
ArrayList<Integer>[] bucket = new ArrayList[Uplimit];//设置桶
for (int i : tag) {//将目标数组中的数按照指定数位装桶
if (bucket[i] == null)
bucket[i] = new ArrayList<>();
bucket[i].add(i);
}
int count = 0;//记数变量
//从桶中取出数据
for (ArrayList<Integer> li : bucket) {
if (li != null)
for (int i : li) {
result[count] = i;
count++;
}
}
}
}
2、基数排序:所谓基数排序即是基于桶排序的一种排序。其思路是将数字按照数位来进行桶排序,如对于百位数进行排序时,将其按照个位、十位、百位的次序依次进行排序。具体做法是确立待排序数组中的最高的数位digit,为此进行digit次循环,每次用十个桶来处理一位(忽略其他位),然后从桶中按桶的序号依次取出这些数据按照当前顺序,来进行下一位同样方式的处理。经过digit次循环后数据便排序完成。该排序适用于一些小整数的情况。
package radixSort;
import java.util.ArrayList;
public class RadixSort {//基数排序
public static void main(String[] args) {
ArrayList<Integer>[][] result = new ArrayList[3][10];
int[] num = {65, 8, 216, 512, 27, 729, 0, 1, 343, 125};
radixSort(num, 3);
}
public static void radixSort(int[] num, int dig)//传入待排列数组与数组中最大位数
{
int[] result = num;//保存结果
for (int i = 0; i < dig; i++)
bucketSort(i, result, result);
for (int r : result)
System.out.print(r + " ");
}
//桶排序,转入参数:指定排序数位,待排序数组,用于接收结果的数组
public static void bucketSort(int digit, int[] tag, int[] result) {
ArrayList<Integer>[] bucket = new ArrayList[10];//设置桶
for (int i : tag) {//将目标数组中的数按照指定数位装桶
int car = (int) (i / (Math.pow(10, digit)) % 10);
if (bucket[car] == null)
bucket[car] = new ArrayList<>();
bucket[car].add(i);
}
int count = 0;//记数变量
//从桶中取出数据
for (ArrayList<Integer> li : bucket) {
if (li != null)
for (int i : li) {
result[count] = i;
count++;
}
}
}
}