鱼C论坛

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

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

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

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

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

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

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

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

struct Bucket
{
    int* data;
    int count;
};

int* add_item(int* array, int count, int item)
{
    int* newArray = (int*)malloc(sizeof(int) * (count + 1));
    int i;

    for (i = 0; i < count; i++)
    {
        newArray[i] = array[i];
    }

    newArray[count] = item;

    return newArray;
}

void bucket_sort(int array[], int length)
{
    int min = array[0];
    int max = array[0];
    int i, j, k, cap, size;
    struct Bucket* bucket = NULL;
    struct Bucket b;

    for (i = 1; i < length; i++)
    {
        if (array[i] > max)
        {
            max = array[i];
        }

        if (array[i] < min)
        {
            min = array[i];
        }
    }

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

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

    for (i = 0; i < length; i++)
    {
        b = bucket[array[i] - min];
        if (b.count < 0)
        {
            b.count = 0;
        }

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

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

        if (size > 0)
        {
            for (j = 0; j < size; j++)
            {
                array[k] = bucket[i].data[j];
                k++;
            }
        }
    }
}

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

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

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

    return 0;
}
最佳答案
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]
想知道小甲鱼最近在做啥?请访问 -> 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]
想知道小甲鱼最近在做啥?请访问 -> 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)里面的
for (i = 0; i < length; i++)
{
b = bucket[array[i] - min];
if (b.count < 0)
{
b.count = 0;
}

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

if (size > 0)
{
for (j = 0; j < size; j++)
{
array[k] = bucket[i].data[j];
 k++;
}
}
这个里面的if语句条件为啥是size>0,
想知道小甲鱼最近在做啥?请访问 -> 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
但感觉问题还是没有解释清楚,所以暂时还没有最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +10 鱼币

币哦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-7 13:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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