鱼C论坛

 找回密码
 立即注册
查看: 907|回复: 4

[已解决]c拓展阅读桶排序

[复制链接]
发表于 2023-6-24 19:07:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 houqing1999 于 2023-6-24 20:43 编辑

能否解释一下此处结构体的作用,以及两个函数的作用,代码具体是怎么实现的,里面for循环的作用
  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. #include <stdio.h>
  3. #include <stdlib.h>

  4. int* add_item(int* array, int count, int item);
  5. void bucket_sort(int array[], int length);

  6. struct Bucket
  7. {
  8.     int* data;
  9.     int count;
  10. };

  11. int* add_item(int* array, int count, int item)
  12. {
  13.     int* newArray = (int*)malloc(sizeof(int) * (count + 1));
  14.     int i;

  15.     for (i = 0; i < count; i++)
  16.     {
  17.         newArray[i] = array[i];
  18.     }

  19.     newArray[count] = item;

  20.     return newArray;
  21. }

  22. void bucket_sort(int array[], int length)
  23. {
  24.     int min = array[0];
  25.     int max = array[0];
  26.     int i, j, k, cap, size;
  27.     struct Bucket* bucket = NULL;
  28.     struct Bucket b;

  29.     for (i = 1; i < length; i++)
  30.     {
  31.         if (array[i] > max)
  32.         {
  33.             max = array[i];
  34.         }

  35.         if (array[i] < min)
  36.         {
  37.             min = array[i];
  38.         }
  39.     }

  40.     cap = max - min + 1;
  41.     bucket = (struct Bucket*)malloc(sizeof(struct Bucket) * cap);

  42.     for (i = 0; i < cap; i++)
  43.     {
  44.         bucket[i] = *(struct Bucket*)malloc(sizeof(struct Bucket));
  45.     }

  46.     for (i = 0; i < length; i++)
  47.     {
  48.         b = bucket[array[i] - min];
  49.         if (b.count < 0)
  50.         {
  51.             b.count = 0;
  52.         }

  53.         bucket[array[i] - min].data = add_item(b.data, b.count++, array[i]);
  54.         bucket[array[i] - min].count = b.count;
  55.     }

  56.     for (i = 0, k = 0; i < cap; i++)
  57.     {
  58.         size = bucket[i].count;

  59.         if (size > 0)
  60.         {
  61.             for (j = 0; j < size; j++)
  62.             {
  63.                 array[k] = bucket[i].data[j];
  64.                 k++;
  65.             }
  66.         }
  67.     }
  68. }

  69. int main(void)
  70. {
  71.     int array[] = { 73, 108, 111, 118, 101, 70, 105, 115, 104, 67, 46, 99, 111, 109 };
  72.     int i, length;

  73.     length = sizeof(array) / sizeof(array[0]);
  74.     bucket_sort(array, length);

  75.     printf("排序后的结果是:");
  76.     for (i = 0; i < length; i++)
  77.     {
  78.         printf("%d ", array[i]);
  79.     }
  80.     putchar('\n');

  81.     return 0;
  82. }
复制代码
最佳答案
2023-6-24 19:07:54
本帖最后由 isdkz 于 2023-6-24 19:09 编辑

[b]首先,我们来看一下这个代码中使用的一些主要元素:

1. 结构体  Bucket :这个结构体由两个字段组成,一个是  int* data ,这是一个指向整数的指针,用于存储指向桶中的元素的指针,另一个是  int count ,这是一个整数,用于记录桶中的元素数量。

2.  add_item  函数:此函数接受一个整数数组、数组的长度和一个整数,然后返回一个新的数组,新的数组包含原数组中的所有元素,再加上新添加的元素。这个函数通过使用  malloc  函数动态分配一个新的内存空间,并使用循环将原数组的元素复制到新数组中,然后在新数组的末尾添加新元素。

3.  bucket_sort  函数:此函数实现了桶排序算法。它首先找出待排序数组中的最小和最大元素,然后创建一个桶数组,每个桶是一个  Bucket  结构体。桶的数量等于最大元素和最小元素的差加一,这样可以确保每个可能的元素值都有一个对应的桶。然后,该函数将每个元素放入对应的桶中。最后,它将所有非空桶中的元素复制回原数组,从而实现排序。

代码的具体实现过程:

1.  bucket_sort  函数开始时,首先找出数组中的最大值和最小值。
2. 根据最大值和最小值的差值计算出需要的桶的数量( cap ),并为桶分配内存空间。
3. 通过遍历数组,将每个元素放入对应的桶中。对于每个元素,先找到其对应的桶( bucket[array[i] - min] ),然后调用  add_item  函数将元素添加到桶的数据中。
4. 当所有的元素都放入桶中后,遍历每个桶,将桶中的元素复制回原数组。

至于  for  循环的作用,主要有以下几点:

· 在  add_item  函数中, for  循环用于复制原数组的所有元素到新数组中。
· 在  bucket_sort  函数中,第一个  for  循环用于找出数组中的最大值和最小值。第二个  for  循环用于初始化桶数组。第三个  for  循环用于遍历原数组,将每个元素添加到对应的桶中。最后一个  for  循环用于遍历桶数组,将桶中的元素复制回原数组。

以上就是这个代码的整体实现和各个元素的作用。[/b]
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-6-24 19:07:54 | 显示全部楼层    本楼为最佳答案   

回帖奖励 +10 鱼币

本帖最后由 isdkz 于 2023-6-24 19:09 编辑

[b]首先,我们来看一下这个代码中使用的一些主要元素:

1. 结构体  Bucket :这个结构体由两个字段组成,一个是  int* data ,这是一个指向整数的指针,用于存储指向桶中的元素的指针,另一个是  int count ,这是一个整数,用于记录桶中的元素数量。

2.  add_item  函数:此函数接受一个整数数组、数组的长度和一个整数,然后返回一个新的数组,新的数组包含原数组中的所有元素,再加上新添加的元素。这个函数通过使用  malloc  函数动态分配一个新的内存空间,并使用循环将原数组的元素复制到新数组中,然后在新数组的末尾添加新元素。

3.  bucket_sort  函数:此函数实现了桶排序算法。它首先找出待排序数组中的最小和最大元素,然后创建一个桶数组,每个桶是一个  Bucket  结构体。桶的数量等于最大元素和最小元素的差加一,这样可以确保每个可能的元素值都有一个对应的桶。然后,该函数将每个元素放入对应的桶中。最后,它将所有非空桶中的元素复制回原数组,从而实现排序。

代码的具体实现过程:

1.  bucket_sort  函数开始时,首先找出数组中的最大值和最小值。
2. 根据最大值和最小值的差值计算出需要的桶的数量( cap ),并为桶分配内存空间。
3. 通过遍历数组,将每个元素放入对应的桶中。对于每个元素,先找到其对应的桶( bucket[array[i] - min] ),然后调用  add_item  函数将元素添加到桶的数据中。
4. 当所有的元素都放入桶中后,遍历每个桶,将桶中的元素复制回原数组。

至于  for  循环的作用,主要有以下几点:

· 在  add_item  函数中, for  循环用于复制原数组的所有元素到新数组中。
· 在  bucket_sort  函数中,第一个  for  循环用于找出数组中的最大值和最小值。第二个  for  循环用于初始化桶数组。第三个  for  循环用于遍历原数组,将每个元素添加到对应的桶中。最后一个  for  循环用于遍历桶数组,将桶中的元素复制回原数组。

以上就是这个代码的整体实现和各个元素的作用。[/b]
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-24 20:31:18 | 显示全部楼层
本帖最后由 houqing1999 于 2023-6-24 20:33 编辑
isdkz 发表于 2023-6-24 19:07
首先,我们来看一下这个代码中使用的一些主要元素:

1. 结构体  Bucket :这个结构体由两个字段组成,一 ...


还有几个点,1为什么add_item 要最后新添加一个元素newArray[count] = item;
2第二个函数里找最大值最小值的for循环初始为啥i=1,这样少比较一个元素吧,
3void bucket_sort(int array[], int length)里面的
  1. for (i = 0; i < length; i++)
  2. {
  3. b = bucket[array[i] - min];
  4. if (b.count < 0)
  5. {
  6. b.count = 0;
  7. }

  8. bucket[array[i] - min].data = add_item(b.data, b.count++, array[i]);
  9. bucket[array[i] - min].count = b.count;
  10. }
复制代码
为啥里面的if语句条件是b.count<0,还是没懂。
同样的
  1. for (i = 0, k = 0; i < cap; i++)
  2. {
  3. size = bucket[i].count;

  4. if (size > 0)
  5. {
  6. for (j = 0; j < size; j++)
  7. {
  8. array[k] = bucket[i].data[j];
  9. k++;
  10. }
  11. }
复制代码

这个里面的if语句条件为啥是size>0,
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-25 14:46:55 | 显示全部楼层
本帖最后由 houqing1999 于 2023-6-27 22:08 编辑
houqing1999 发表于 2023-6-24 20:31
还有几个点,1为什么add_item 要最后新添加一个元素newArray[count] = item;
2第二个函数里找最大值最 ...


问题的解决请见这个,给新鱼油索引一下https://fishc.com.cn/thread-230064-1-1.html
但感觉问题还是没有解释清楚,所以暂时还没有最佳答案
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-25 18:03:01 | 显示全部楼层

回帖奖励 +10 鱼币

币哦
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-22 09:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表