算法导论-计数排序

计数排序并不基于元素的比较,而是一种利用数组下标来确定元素正确位置的算法。计数排序的核心在于将输入的数据值转化为键值存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序算法的时间复杂度O(n + k)(k为整数的范围)。
简单描述就是,在一个有确定范围的整数空间中,建立一个长度更大的数组,如当输入的元素是 n 个 0 到 k 之间的整数时,建立一个长度大于等于k的数组。该数组的每一个下标位置的值代表了数组中对应整数出现的次数。根据这个统计结果,直接遍历数组,输出数组元素的下标值,元素的值是几, 就输出几次。

伪码

COUNTSORT(A,B,k)
//let C[0...k] be a new array
for i=0 to k
	C[i] = 0
for j=1 to A.length
	C[a[j]] ++
for i=1 to k
	C[i] += c[i-1]
for j=A.length downto 1
	B[C[A[j]]] = A[j]
	C[A[j]] --

算法演示过程
算法导论-计数排序_第1张图片

C++实现

#include
#include   //用vector比用数组好操作一些
using namespace std;

void countsort(vector<int>& arr, int k) {
	int size = arr.size();
	if (size < 1) {
		return;
	}
	vector<int> count(k + 1, 0);
	vector<int> temp(arr);
	for (auto x : arr) {
		count[x]++;
	}
	for (int i = 1; i < k; i++) {
		count[i] += count[i - 1];
	}
	for (int j = size - 1; j > 0; j--) {
		arr[count[temp[j]] - 1] = temp[j];
		count[temp[j]]--;
	}
}

int main() {
	vector<int> arr = { 1,4,4,5,6,7,7,7,8,8,8,9,4,3 };
	int k = 100;
	countsort(arr, k);
	for (auto x : arr)
		cout << x << "\t";
	cout << endl;
	return 0;
}

算法导论-计数排序_第2张图片
java实现

import java.util.Arrays;

public class P_jishu {
    public static int[] CountSort(int[] a,int k){
        int[] C=new int[k+1];//构造C数组
        int length=a.length,sum=0;//获取A数组大小用于构造B数组
        int[] B=new int[length];//构造B数组
        for(int i=0;i<length;i++)
        {
            C[a[i]]+=1;// 统计A中各元素个数,存入C数组
        }
        for(int i=0;i<k+1;i++)//修改C数组
        {
            sum+=C[i];  //sum = sum+C[i]; //把前面的所以的数的和都保存起来
            C[i] = sum;
        }
        for(int i=length-1;i>=0;i--)//遍历A数组,构造B数组
        {

            B[C[a[i]]-1]=a[i];//将A中该元素放到排序后数组B中指定的位置
            C[a[i]]--;//将C中该元素-1,方便存放下一个同样大小的元素

        }
        return B;

    }

    public static void main(String[] args){
        int[] a = {1,2,3,4,4,3,2,3,3,32,5};
        //int[] a = {2,3,4,4,4,4,2};
        int k = 100;
        System.out.println(Arrays.toString(CountSort(a,k)));
    }
}

算法导论-计数排序_第3张图片

你可能感兴趣的:(C/C++,算法)