计数排序
很久之前我不知道计数排序的意义何在
算法导论中说,计数排序的基本思想就是对每一个输入元素x,确定小于x的元素个数。有了这一个信息,就可以把x直接放到它最终输出数组中的位置上。
我觉得既然计数排序中要根据原数组的最大值来定义 排序中要使用的临时数组,那还不如直接新建一个大小为最大值+1的temp数组,全部置0之后读入原数组,对temp的对应下标的值++,然后按值的次数来输出数字不是更快吗。
不过还是写了下备用
#include<stdio.h> void printArray(int array[],int length) { for(int i=1;i<=length;i++) { printf("%d ",array[i]); } printf("\n"); } void countingSort(int nums[],int result[],int max,int length) //nums原数组,result为输出数组,max是原数组中最大的元素, { int temp[max+2]; int count=1; for(int i=0;i<=max;i++)temp[i]=0; //置空 for(int i=1;i<=length;i++)temp[nums[i]]++; //记录每个数字出现的次数 //printf("Temp now is:"); //printArray(temp,max); for(int i=1;i<=max;i++)temp[i]=temp[i]+temp[i-1]; //printf("Temp now is:"); //printArray(temp,max); for(int j=length;j>=1;j--) //倒装在result数组中 { result[temp[nums[j]]]=nums[j]; temp[nums[j]]--; } //printArray(result,length); } int main() { printf("请输入要数组的大小,和输入数组元素,下面进行计数排序:"); int n; scanf("%d",&n); int nums[100],result[100]; int max=0; for(int i=1;i<=n;i++) { scanf("%d",&nums[i]); if(nums[i]>=max)max=nums[i]; //在输入的时候就开始记录数组中的最大值,才能确定临时数组的开辟空间 } countingSort(nums,result,max,n); printArray(result,n); return 0; }
posted on 2012-11-22 16:31 Aquariuslt 阅读(176) 评论(0) 收藏 举报
浙公网安备 33010602011771号