sort_algorithm/c/countsort.c
2024-09-29 15:27:49 +08:00

57 lines
1.2 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 计数排序基础版作者C语言技术网www.freecplus.net码农有道。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 获取待排序数组的最大元素的值。
int arrmax(int *arr,unsigned int len)
{
int ii=0;
int imax=0;
for (ii=0;ii<len;ii++) if (imax<arr[ii]) imax=arr[ii];
return imax;
}
// 计数排序主函数arr-待排序数组的地址len-数组的长度。
void countsort(int *arr,unsigned int len)
{
if (len<2) return;
int imax=arrmax(arr,len); // 获取待排序数组的最大元素的值。
int arrtmp[imax+1]; // 临时数组的大小为imax+1。
memset(arrtmp,0,sizeof(arrtmp)); // 初始化临时数组。
int ii,jj,kk;
// 临时数组计数。
for (ii=0;ii<len;ii++) arrtmp[arr[ii]]++;
// 把临时数组计数的内容填充到arr中。
ii=0;
for (jj=0;jj<imax+1;jj++)
{
for (kk=0;kk<arrtmp[jj];kk++) arr[ii++]=jj;
}
}
int main()
{
int arr[]={2,3,8,7,1,2,2,2,7,3,9,8,2,1,4,2,4,6,9,2};
int len=sizeof(arr)/sizeof(int);
int xx; for (xx=0;xx<len;xx++) printf("%2d ",arr[xx]); printf("\n");
countsort(arr,len);
// 显示排序结果。
int yy; for (yy=0;yy<len;yy++) printf("%2d ",arr[yy]); printf("\n");
// system("pause"); // widnows下的C启用本行代码。
return 0;
}