赞
踩
桶排序、计数排序、基数排序这三种排序因为时间复杂度都是o(n)线性的,所以这三种排序方法都属于线性排序。这三种算法的原理都不难,时间复杂度和空间复杂度的分析也比较简单,所以我们将讨论的重心放在三种算法各自的适用场景上。
桶排序的思想是将待排序的数据分到几个有序的桶里,再将每个桶内的数据自行排序,然后再把每个桶内的数据按顺序取出,得到的序列就是有序的。
桶排序的使用需要满足:
- class Solution{
-
- private static final InsertSort insertSort = new InsertSort();
- public int[] sort(int[]a){
- return bucketSort(a, 5);
- };
-
- public int[] bucketSort(int[]a, int bucketSize){
- if(a.length == 0){
- return a;
- }
- minValue = a[0];
- maxValue = a[0];
- //找到数组中的最小值和最大值
- for(int value:a){
- if(minValue>value){
- minvalue = value;
- }else if(maxValue<value){
- maxValue = value;
- }
- }
- // 生成bucketNum个桶
- int bucketNum = (int)Math.floor((maxValue - minValue)/bucketSize);
- int[][] buckets = new int[bucketNum][0];
-
- //向桶中添加数据
- for(int i=0; i<a.length; i++){
- int index = (int)Math.floor((a[i]-minValue)/bucketSize);
- //buckets是一个二维数组,对应的buckets[i]就是一维数组,arrAppend函数的功能是为一维数组动态扩容
- buckets[index] = arrAppend(buckets[index], a[i]);
- }
- //完成最终的排序
- int arrCount = 0;
- for(int[] bucket: buckets){
- if(bucket.length == 0){
- continue;
- }
- bucket = insertSort.sort(bucket); //插入排序桶内元素
- for(int k=0; k<bucket.length; k++){
- a[arrCount++] = bucket[k];
- }
- }
-
- };
- //实现对数组的动态扩容
- public int[] arrAppend(int[]a, int value){
- int[] arr = Arrays.copyOf(a, a.length+1);
- arr[arr.length-1] = value;
- }
- }

计数排序其实是桶排序的一种特殊情况,当待排序的数据范围值不大,如最大值为k时,就可以将所有的值划分到k个桶中,每个桶中的数据都是相同的,这样就省掉了桶内数据排序的时间。
计数排序的使用需要满足:
- class Solution{
- public void countSort(int[]a, int n){
- if(n<=0) return;
-
- int maxValue = a[0];
- //遍历找到数组最大值
- for(int value:a){
- if(value > maxValue){
- maxValue = value;
- }
- }
- int[] c = new int[maxValue+1]; //得到各个值的计数数组
- for(int i=0; i<=max; i++){ //为计数数组赋初值
- c[i] = 0;
- }
- for(int value:a){
- c[value] ++; //得出计数数组每个下标对应的数的个数
- }
- for(int i=1; i<=max; i++){
- c[i] = c[i] + c[-1]; //将累计个数数组求出来
- }
-
- int[] temp = new int[n]; //生成一个和待排序数组相同大小的数组,用于存储排好序的数组值
- //完成数组的排序过程
- for(int i=n-1; i>0; i--){
- temp[c[a[i]]-1] = a[i];
- c[a[i]]--;
- }
- //将排好序的数组值复制给原数组,整个过程结束
- for(int i=0; i<n; i++){
- a[i]=temp[i];
- }
- }
- }

基数排序的在实际操作时为了保证算法的稳定性一般是按照位数,从后往前排
基数排序使用时需要满足:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。