8-2.计数排序
计数排序的基本思想是:统计一个数序列中小于某个元素a的个数为n,则直接把该元素a放到第n+1个位置上。当然当过有几个元素相同时要做适当的调整,因为不能把所有的元素放到同一个位置上。计数排序假设输入的元素都是0到k之间的整数。
// 8-2.计数排序.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream> using namespace std; void CountSort(int a[],int b[],int array_size,int k) { int* c=new int[k+1]; for (int i=0;i<=k;i++) { c[i]=0; } //c[i] contains the number of elements equal to i for (int i=0;i<array_size;i++) { c[a[i]]++; } //c[i] contains the number of elements less than or equal to i for (int i=1;i<=k;i++) { c[i]=c[i]+c[i-1]; } //confirm the num position for (int i=array_size-1;i>=0;i--) { b[c[a[i]]-1]=a[i]; c[a[i]]--; } } int _tmain(int argc, _TCHAR* argv[]) { int a[8]={2,5,3,0,2,3,0,3}; int b[8]; CountSort(a,b,8,5); for (int i=0;i<8;i++) { cout<<b[i]<<" "; } cout<<endl; return 0; }
对于数据2 5 3 0 2 3 0 3程序执行的过程如下图所示:
现在有个问题,若必须是0到n的自然数,是不是用途很小?我想了想,其实可以任意整数的,即找出最小的数来,看看与0的距离d,把所有的数同时减去d,划到0到n的范围内,计数排序。到最后待恢复就可以了。
“过一个平凡无趣的人生实在太容易了,你可以不读书,不冒险,不运动,不写作,不外出,不折腾……但是,人生最后悔的事情就是:我本可以。”——陈素封。