c++ 如何使用链表数组对一个数字数组进行桶/箱排序?

jum4pzuy  于 2022-11-27  发布在  其他
关注(0)|答案(1)|浏览(93)

我已经创建了一个程序到一个数字数组的桶排序。为此,我已经创建了一个数组的链接表根据bin排序方法。

// Bucket or Bin sort 
#include<iostream>
using namespace std;

//Bin sort has linear complexity( O(n))

// node class
class node
{
public:
  int data;
  node *next;
};

// print array function
void
print (int arr[], int n)
{
  for (int i = 0; i < n; i++)
    {
      cout << arr[i] << " ";
    }
  cout << endl;
}

// max element of array function
int
get_max (int arr[], int n)
{
  int max = arr[0];

  for (int i = 0; i < n; i++)
    {
      if (arr[i] > max)
    max = arr[i];
    }

  return max;
}

// insert function of linked list at end needs head pointer
void
insert (node * head, int x)
{
  node *temp = new node;
  temp->data = x;
  temp->next = nullptr;

  while (head)
    {
      head = head->next;
    }
  head = temp;
}

void
Bin_sort (int arr[], int n)
{

  // max element of array
  int max_num = get_max (arr, n);
  int i;

  // double node pointer act as array of pointer of heads of linked lists
  node **bin;
  bin = new node *[max_num + 1];

  // pointing each head as nullptr
  for (i = 0; i < max_num + 1; i++)
    {
      bin[i] = nullptr;
    }

  // inserting value of array at position in linked list array
  for (i = 0; i < n; i++)
    {
      insert (bin[arr[i]], arr[i]);
    }

  // after filling linked lists array retrieving data to fill back in main array (arr) in sorted manner
  int k = 0;
  for (i = 0; i < max_num + 1; i++)
    {
      while (bin[i] != nullptr)
    {
      arr[k] = bin[i]->data;
      cout << arr[k] << endl;
      bin[i] = bin[i]->next;
      k++;
    }
    }

}

int
main ()
{
  int arr[] = { 3, 22, 34, 12, 15, 22 };
  print (arr, 6);
  Bin_sort (arr, 6);
  cout << "after sortion" << endl;
  print (arr, 6);
  return 7;
}

我试图排序数组由桶排序算法。我猜错误是当我创建/插入一个节点插入数据它没有正确连接与头节点。所以最有可能的问题是在数据插入部分。这里是一个图像的算法x1c 0d1x

m0rkklqb

m0rkklqb1#

问题确实出在insert方法上,尽管这是一个很容易犯的错误。您的算法试图做的是转到最后一个节点,并将其指向新创建的节点。它实际做的是越过列表的末尾,并将一个局部变量指向新节点。然而,我建议利用链表的恒定时间插入,通过添加到前端-创建新节点,设置它指向头部,并将它设置为新头部,或类似的操作。
至于整个程序,视频中显示的算法是 * 计数排序 *,运行在O(max(arr)+ n)时间,其中max(arr)是数组中的最大元素,这意味着它只对包含小元素的大数据集有用。其次,计数排序通常使用整数数组来存储每个元素的计数,不是一个相同元素的链表。我假设这是一个赋值,我建议仔细检查它是否要求计数排序而不是传统的桶排序。

相关问题