package com.test.sort;
import java.util.Arrays;
/**
* 计数排序基本思想:
* 1、求出待排序序列最大值
* 2、创建长度为最大值+1的计数数组
* 3、遍历原数组,以原数组中元素的值为下标,元素出现次数为值填充计数数组
* 4、遍历计数数组,将次数大于0的下标依次放入原数组中
* 排序完成
*
*/
public class CountSortDemo {
public static void main(String[] args) {
int[] arr= new int[]{1,2,-4,-8,6,3,5,3};
countMinusSort(arr);
System.out.println(Arrays.toString(arr));
}
/**
* 正整数排序
* @param arr
*/
public static void countSort(int[] arr){
int maxElement=arr[0];
for (int i=1;i<arr.length;i++){
if(arr[i]>maxElement){
maxElement=arr[i];
}
}
int[] countArray=new int[maxElement+1];
for (int i=0;i<arr.length;i++){
countArray[arr[i]]++;
}
int index=0;
//正序
for (int i=0;i<countArray.length;i++){
while (countArray[i]>0){
arr[index++]=i;
countArray[i]--;
}
}
//倒序
// for (int i=countArray.length-1;i>=0;i--){
// while (countArray[i]>0){
// arr[index++]=i;
// countArray[i]--;
// }
// }
}
/**
* 整数排序
* @param arr
*/
public static void countMinusSort(int[] arr){
int maxElement=arr[0];
int minElement=arr[0];
for (int i=1;i<arr.length;i++){
if(arr[i]>maxElement){
maxElement=arr[i];
}
if(arr[i]<minElement){
minElement=arr[i];
}
}
int[] countPlusArray=new int[maxElement+1];
int[] countMinusArray=new int[(0-minElement)+1];
for (int i=0;i<arr.length;i++){
if(arr[i]>=0){
countPlusArray[arr[i]]++;
}else {
countMinusArray[0-arr[i]]++;
}
}
int index=0;
for (int i=countMinusArray.length-1;i>=0;i--){
while (countMinusArray[i]>0){
arr[index++]=-i;
countMinusArray[i]--;
}
}
for (int i=0;i<countPlusArray.length;i++){
while (countPlusArray[i]>0){
arr[index++]=i;
countPlusArray[i]--;
}
}
}
}
排序算法-计数排序
最新推荐文章于 2024-09-26 11:40:59 发布