赞
踩
目录
计数排序是一种非比较排序,其核心是将序列中的元素作为键存储在额外的数组空间中,而该元素的个数作为值存储在数组空间中,通过遍历该数组排序。
计数排序的核心是:利用数组的索引是有序的,通过将序列中的元素作为索引,其个数作为值放入数组,遍历数组来排序。
- package com.kgf.algorithm.sort;
-
- /***
- * 计数排序
- */
- public class CountSort {
-
- public static void main(String[] args) {
- int[] nums = {1, 4, 9, 2, 5, 3, 7, 6, 22, 23, 15, 24, 0, 3,
- 4, 5, 2, 3, 5, 12, 1, 3, 4, 2, 1,
- 3, 45, 1, 1};
- // 计数排序
- CountSort countSort = new CountSort();
- // countSort.sort(nums);
- int[] ints = countSort.sort2(nums);
- for (int num : ints) {
- System.out.print(num+"\t");
- }
- System.out.println();
- }
-
- /***
- * 计数排序优化
- * @param nums
- */
- public int[] sort2(int[] nums){
- //找到数组最大值和最小值
- int max = nums[0],min = nums[0];
- for (int i = 1; i < nums.length; i++) {
- if (max<nums[i]){
- max = nums[i];
- }
- if (min>nums[i]){
- min = nums[i];
- }
- }
-
- //首先创建一个固定长度的空数组
- int[] newArr = new int[max-min+1];
- //将nums的值作为下标,数量作为值存入newarr
- for (int i = 0; i < nums.length; i++) {
- newArr[nums[i]-min]++;
- }
-
- //为了防止相同的元素顺序不一致,使用countArr数组进行排序
- int[] countArr = new int[newArr.length];
- for (int i = 0; i < newArr.length; i++) {
- if (i==0){
- countArr[i] = newArr[i];
- continue;
- }
- countArr[i] = newArr[i]+countArr[i-1];
- }
- //定义一个数组用来存储排序后的元素
- int[] result = new int[nums.length];
- for (int i = 0; i < nums.length; i++) {
- result[countArr[nums[i]-min]-1] = nums[i];
- countArr[nums[i]-min]--;
- }
- return result;
- }
-
- /***
- * 简单的计数方法
- * @param nums
- * @return
- */
- public void sort(int[] nums){
- //找到数组最大值
- int max = nums[0];
- for (int i = 1; i < nums.length; i++) {
- if (max<nums[i]){
- max = nums[i];
- }
- }
- //首先创建一个固定长度的空数组
- int[] newArr = new int[max+1];
- //将nums的值作为下标,数量作为值存入newarr
- for (int i = 0; i < nums.length; i++) {
- newArr[nums[i]]++;
- }
- //创建一个最终的空数组存储
- int j = 0;
- for (int i = 0; i < newArr.length; i++) {
- for (int k = 0; k < newArr[i]; k++) {
- nums[j] = i;
- j++;
- }
- }
- }
- }
计数排序是非比较排序,时间复杂度是O(n+k),空间复杂度是O(k),是稳定算法。(n表示的是数组的个数,k表示的max-min+1的大小)
时间复杂度是O(n+k):通过上面的代码可知最终的计数算法花费的时间是3n+k,则时间复杂度是O(n+k)。
空间复杂度是O(k):如果出去最后的返回数组,则空间复杂度是2k,则空间复杂度是O(k)
稳定算法:由于统计数组可以知道该索引在原数组中排第几位,相同的元素其在原数组中排列在后面,其从原数组的后面遍历,其在最终数组中的索引也在后面,所以相同的元素其相对位置不会改变。
计数排序的重点是:将序列中的元素作为键存储在额外的数组空间中,通过遍历来排序。类似于:我要给一系类弹珠从小到大排列,我可以拿一个模具,模具上有从小到大的孔洞,我把弹珠放进孔洞中,最后只要从模具中从小到大的孔洞中倒出弹珠即可。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。