桶排序

Posted rakint

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了桶排序相关的知识,希望对你有一定的参考价值。

#include <iostream>
#include <iomanip>
using namespace std;
#define NARRAY 8  // array size
#define NBUCKET 5 // bucket size
#define INTERVAL 10 // bucket range
struct Node
{
 int data;
 struct Node *next;
};//链表
void BucketSort(int arr[]);
struct Node *InsertionSort(struct Node *list);
void print(int arr[]);
void printBuckets(struct Node *list);
int getBucketIndex(int value);
void BucketSort(int arr[])
{
 int i, j;
 struct Node **buckets;//指向链表的链表
        // allocate memory for array of pointers to the buckets
 buckets = (struct Node **)malloc(sizeof(struct Node*) * NBUCKET);

 // initialize pointers to the buckets
 for (i = 0; i < NBUCKET; ++i) {
  buckets[i] = NULL;
 }
 // put items into the buckets
 for (i = 0; i < NARRAY; ++i) {
  struct Node *current;
  int pos = getBucketIndex(arr[i]);
  current = (struct Node *) malloc(sizeof(struct Node));
  current->data = arr[i];
  current->next = buckets[pos];//在表头插入,指向上一个buckets[pos]指向的对象
         //第一个buckets[pos]为NULL
  buckets[pos] = current;
 }
 // check what‘s in each bucket
 for (i = 0; i < NBUCKET; i++) {
  cout << "Bucket[" << i << "] : ";
  printBuckets(buckets[i]);
  cout << endl;
 }
 // sorting bucket using Insertion Sort
 for (i = 0; i < NBUCKET; ++i) {
  buckets[i] = InsertionSort(buckets[i]);
 }

 // check what‘s in each bucket
 cout << "-------------" << endl;
 cout << "Bucktets after sorted" << endl;
 for (i = 0; i < NBUCKET; i++) {
  cout << "Bucket[" << i << "] : ";
  printBuckets(buckets[i]);
  cout << endl;
 }
 // put items back to original array
 for (j = 0, i = 0; i < NBUCKET; ++i) {
  struct Node *node;
  node = buckets[i];
  while (node) {
   arr[j++] = node->data;
   node = node->next;
  }
 }
 // free memory
 for (i = 0; i < NBUCKET; ++i) {
  struct Node *node;
  node = buckets[i];
  while (node) {
   struct Node *tmp;
   tmp = node;
   node = node->next;
   free(tmp);
  }
 }
 free(buckets);
 return;
}
// Insertion Sort
struct Node *InsertionSort(struct Node *list)
{
 struct Node *k, *nodeList;
 // need at least two items to sort
 if (list == 0 || list->next == 0) {
  return list;
 }

 nodeList = list;
 k = list->next;
 nodeList->next = 0; // 1st node is new list
 while (k != 0) {
  struct Node *ptr;
  // check if insert before first
  if (nodeList->data > k->data) {
   struct Node *tmp;
   tmp = k;
   k = k->next;
   tmp->next = nodeList;
   nodeList = tmp;
   continue;
  }

  for (ptr = nodeList; ptr->next != 0; ptr = ptr->next) {
   if (ptr->next->data > k->data) break;
  }

  if (ptr->next != 0) {
   struct Node *tmp;
   tmp = k;
   k = k->next;
   tmp->next = ptr->next;
   ptr->next = tmp;
   continue;
  }
  else {
   ptr->next = k;
   k = k->next;
   ptr->next->next = 0;
   continue;
  }
 }
 return nodeList;
}
int getBucketIndex(int value)
{
 return value / INTERVAL;
}
void print(int ar[])
{
 int i;
 for (i = 0; i < NARRAY; ++i) {
  cout << setw(3) << ar[i];
 }
 cout << endl;
}
void printBuckets(struct Node *list)
{
 struct Node *cur = list;
 while (cur) {
  cout << setw(3) << cur->data;//setw(3)为对齐操作
  cur = cur->next;
 }
}
int main(void)
{
 int array[NARRAY] = { 29,25,3,49,9,37,21,43 };

 cout << "Initial array" << endl;
 print(array);
 cout << "-------------" << endl;

 BucketSort(array);
 cout << "-------------" << endl;
 cout << "Sorted array" << endl;
 print(array);
 return 0;
}

 

//插入排序部分,如何返回一个链表的还不是很明白
















































































































































以上是关于桶排序的主要内容,如果未能解决你的问题,请参考以下文章

线性排序:桶排序计数排序

桶排序和基数排序

排序算法——桶排序

排序5:桶排序

图解排序 8/10 - 桶排序

java实现桶排序