From 3ea4e8417ae5fd031c331cb9dac7b31173d1a3ac Mon Sep 17 00:00:00 2001 From: pmkfqw2gu <2511089200@qq.com> Date: Thu, 17 Feb 2022 22:20:18 +0800 Subject: [PATCH] =?UTF-8?q?Add=20=E8=AE=A1=E6=95=B0=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 计数排序 | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 计数排序 diff --git a/计数排序 b/计数排序 new file mode 100644 index 0000000..7d616d3 --- /dev/null +++ b/计数排序 @@ -0,0 +1,63 @@ +8.3 代码 +#include +#include +#include +//计数排序 +void CountSort(int *a, int len) +{ + assert(a); + //通过max和min计算出临时数组所需要开辟的空间大小 + int max = a[0], min = a[0]; + for (int i = 0; i < len; i++) + { + if (a[i] > max) + max = a[i]; + if (a[i] < min) + min = a[i]; + } + //使用calloc将数组都初始化为0 + int range = max - min + 1; + int *b = (int *)calloc(range, sizeof(int)); + //使用临时数组记录原始数组中每个数的个数 + for (int i = 0; i < len; i++) + { + //注意:这里在存储上要在原始数组数值上减去min才不会出现越界问题 + b[a[i] - min] += 1; + } + int j = 0; + //根据统计结果,重新对元素进行回收 + for (int i = 0; i < range; i++) + { + while (b[i]--) + { + //注意:要将i的值加上min才能还原到原始数据 + a[j++] = i + min; + } + } + //释放临时数组 + free(b); + b = NULL; +} +//打印数组 +void PrintArray(int *a, int len) +{ + for (int i = 0; i < len; i++) + { + printf("%d ", a[i]); + } + printf("\n"); +} +int main() +{ + int a[] = { 22, 34, 3, 32, 82, 55, 89, 50, 37, 5, 64, 35, 9, 70 }; + printf("排序前:"); + PrintArray(a, sizeof(a) / sizeof(int)); + CountSort(a, sizeof(a) / sizeof(int)); + printf("排序后:"); + PrintArray(a, sizeof(a) / sizeof(int)); + system("pause"); + return 0; +} + +8.4 运行时间 +0.3818s \ No newline at end of file