【算法】——排序:计数排序
计数排序的核心思想就是将需要排序的数组的元素转为下标,在辅助空间数组(辅助空间数组的初始都是0)中找到对应元素的下标位置,将该位置的元素++,扫描下标,将对应不为0的下标记录赋值给原数组,然后对应下标元素--
图例分析:
具体代码:
#include<stdio.h> void countSort(int *A,int len); int maxA(int *A,int len); int main() { int i; int j=0; int A[1000]; char ch; int len; //实现输入未知数个整形数组的同时记录数组的长度 do{ scanf("%d",&A[j]); j++; len=j; }while((ch=getchar()!='\n')); countSort(A,len);//调用计数排序 for(i=0; i<len; i++) { printf("%d ",A[i]); } return 0; } void countSort(int *A,int len) { int i,j; int k=0; //获取到数组A中的最大的元素的值 int n=maxA(A,len); //创建辅助空间help[]数组,数组大小时max+1,原始都是0 int help[n+1]={0}; //循环遍历(在A中遍历)将A的元素对应给help的下标位置++,help[A[i]++] for(i=0; i<len; i++) { help[A[i]]++; } //扫描辅助数组help,如果对应的值不为0的情况下,就将下标赋值给原本的数组 for(j=0; j<n+1; j++) { while(help[j]!=0)//注意应该是while,而不是if,一直循环到当前位置为0,在移动到下一位 { A[k]=j;//按顺序将循环时对应的值不为0的下标赋值给原数组A k++;//赋值之后原本的数组A移动位置 help[j]--;//对应的数值也需要减一 } //如果help[j]是等于0的情况就说明原本的数组没有这个元素,直接可以不管 } } //找出数组中的最大值 int maxA(int *A,int len) { int i; int max=A[0]; for(i=0; i<len; i++) { if(A[i]>max) { max=A[i]; } } return max; }
结果演示:
方法总结:时间效率高,速度快,但是当数的范围很大的时候回导致辅助空间也很大,不过在1000以内还是可以忍受的。