微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 C 中使用 Bucket Sort 对数组进行排序 关于在链表中插入新元素的代码如何工作的问题

如何解决在 C 中使用 Bucket Sort 对数组进行排序 关于在链表中插入新元素的代码如何工作的问题

我正在用 C 编写一个程序,该程序使用 bucketSort 对数组进行排序。我的代码有效。我可以打印数据结构,原始数组的每个元素都在正确的“存储桶”中。我了解链表是什么以及它是如何工作的。但是我不太明白这部分代码是如何工作的。

/*If the bucket has already another element,*/
            else

            {
             
             
                p -> next = buckets[index];

                buckets[index] = p;
            }

而且我不太清楚链表的最后一个节点将如何指向 NULL 以指示链表的结尾?

bucketSort 函数

void bucketSort(float arr[],int arr_length)
    {
        /*Sort an array within elements from [0,1). We are going to use insertion sort
        as a subroutine.
        Assume arr contains elements from [0,1)*/
        
        //Initialize empty buckets. 
         for (int i = 0; i < NBUCKETS; i++)
         {
            buckets[i] = NULL;
         }
        
        //Fill the buckets with respective elements
        
        for (int i = 0; i < arr_length; i++)
        {
            node *p = malloc(sizeof(node));
            //Check if malloc has succeeded in getting memory
            if (p == NULL)
             {
                  printf("Something went wrong!\n");
                  exit(1);
             }
            //Get index of element arr[i]
            int index = getBucketIndex(arr[i]);
            //Assign the element arr[i] to the data structure
            p -> data = arr[i];
            //If data is the first element of bucket do the following...
            if (buckets[index] == NULL)
            {
                buckets[index] = p;
            }
            /*If the bucket has already another element,*/
            else
            
            {
                p -> next = buckets[index];
             
                buckets[index] = p;
            }
            
        }
   

解决方法

当最初创建bucket数组时,通常所有bucket都被标记为空,如下:

class SearchBar extends React.Component {

  onformsubmit(event) {
    event.preventDefault();
    console.log(this.state.text);
  }

  state = { text: '' }

  render() {
    return (
      <div className="ui segment">
        <form className="ui form" onSubmit={this.onformsubmit}>
          <div className="field">
            <label>Image Search: </label>
            <input type='text'
              onChange={(e) => { this.setState({ text: e.target.value }) }} //rerendered
              value={this.state.text} // overwrite by state.text 
            />
          </div>
        </form>
      </div>
    );
  }
}

然后假设您想在第一个存储桶中插入一个新元素 buckets[0] -> NULL buckets[1] -> NULL 。您通过 42 指向它并指向某个随机位置作为其下一个元素:

p

当您运行代码以插入第一项时会发生这种情况(如果您已经拥有指向 p -> (42) -> ? 的存储桶,则实际上不需要特殊情况:

NULL

这就是当您运行代码插入第二个项目 // buckets[0] -> NULL // p -> (42) -> ? p -> next = buckets[index]; // p -> (42,NULL) buckets[index] = p; // buckets[0] -> (42,NULL) -> NULL 时发生的情况:

99

换句话说,它只是在列表的开头(空或其他)插入新项目。


您发布的代码不安全是完全正确的。如果存储桶当前为空,则没有将新项的下一个指针设置为 // buckets[0] -> (42) -> NULL // p -> (99) -> ? p -> next = buckets[index]; // p -> (99) -> (42) -> NULL buckets[index] = p; // buckets[0] -> (99) -> (42) -> NULL 的语句,这几乎肯定会导致结构损坏。

好消息是,如上所述,假设桶正确初始化为NULL(如果明确检查原始代码以确定存储桶是否为空,这似乎很可能基于原始代码的事实)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。