码迷,mamicode.com
首页 > 编程语言 > 详细

桶排序

时间:2018-10-12 16:15:06      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:range   ntb   ext   --   include   namespace   void   return   dex   

#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;
}

 

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

桶排序

标签:range   ntb   ext   --   include   namespace   void   return   dex   

原文地址:https://www.cnblogs.com/Rakint/p/9778138.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!