JAVA 计数排序,桶排序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/JLU_Lei/article/details/78845514

排序算法分为两种:比较算法、非比较算法


其中比较排序是将要排序内容通过比较数值大小的方法,决定排列顺序。为了降低时间复杂度引入分治,递归等方法。例如:选择排序,插入排序,冒泡排序等基础排序法。


非比较排序法是指通过统计每个数字的个数,或者位置的方法将待排序序列进行排序的算法。其中计数算法,桶排序算法即为非比较算法。



计数算法:计数算法的原理类似于Hash表的原理。建立一张数据表,在表中统计每个数据出现的次数

0 1 2 3 4 5 6
0(次) 1(次) 3(次) 5(次) 2(次) 0(次) 1(次)
通过以上方法可清楚开出1出现1次,2出现3次,3出现5次,4出现2次,5出现0次,6出现1次

->[1,2,2,2,3,3,3,3,3,4,4,6] 排序结果显而易见。代码如下:


import java.util.ArrayList;
import java.util.List;

public class CountSort {
	public static  List<Integer> countSort(int data[]){ 
		//得到数组的最大值与最小值,从而得到数据数组的长度
		int max = 0;
		int min = 0;
		for (int i = 0; i < data.length; i++) {
			max=data[i]>max?data[i]:max;
			min=data[i]<min?data[i]:min;
		}
		//数据数组装配
		int[] temp=new int[max-min+1];
		for (int i = 0; i < data.length; i++) {
			int aim=data[i];
			temp[aim-min]=temp[aim-min]+1;
		}
		System.out.print("temp:");
		for (int i = 0; i < temp.length; i++) {
			System.out.print(temp[i]);
		}
		//数据数组到结果返回
		List<Integer> result=new ArrayList<>();
		for (int i = 0; i < temp.length; i++) {
			if(temp[i]!=0){
				for (int j = 0; j < temp[i]; j++) {
					result.add(min+i);	
				}
			}
		}
		return result;
	}
	public static void main(String[] args) {
		int a[]=new int[]{1,2,1,3,0,5,1};
		List<Integer> list=countSort(a);
		System.out.println();
		for (int i = 0; i < list.size(); i++) {
			System.out.print(list.get(i));
		}
	}

}
返回结果:

temp:131101
0111235
时间负责度为O(n),与基础排序法相比明显降低,但降低时间复杂度的代价是牺牲了空间。该方法使用在数字范围不是很大的情况,否则会浪费大量空间。

桶排序:

桶排序是指根据待排序数组内容建立若干个桶,每个桶代表一个数据范围,当待排序数组中的元素命中了其中某个桶时,将该元素放在桶中。当把所有的元素都放在桶中后,在各自的桶中内部进行排序操作。因为每个桶的范围是数轴递增的,将每个桶直接合并即可得到最后排序。代码:

public static void bucketSort(int[] arr){
    
    int max = Integer.MIN_VALUE;
    int min = Integer.MAX_VALUE;
    for(int i = 0; i < arr.length; i++){
        max = Math.max(max, arr[i]);
        min = Math.min(min, arr[i]);
    }
    
    //桶数
    int bucketNum = (max - min) / arr.length + 1;
    ArrayList<ArrayList<Integer>> bucketArr = new ArrayList<>(bucketNum);
    for(int i = 0; i < bucketNum; i++){
        bucketArr.add(new ArrayList<Integer>());
    }
    
    //将每个元素放入桶
    for(int i = 0; i < arr.length; i++){
        int num = (arr[i] - min) / (arr.length);
        bucketArr.get(num).add(arr[i]);
    }
    
    //对每个桶进行排序
    for(int i = 0; i < bucketArr.size(); i++){
        Collections.sort(bucketArr.get(i));
    }
    
    System.out.println(bucketArr.toString());
    
}


猜你喜欢

转载自blog.csdn.net/JLU_Lei/article/details/78845514