#define _CRT_SECURE_NO_WARNINGS
#include <malloc.h>
#include <stdio.h>
typedef struct ListNode {
int data;
struct ListNode* next;
} LN;
void displayL(LN* L) {
LN* p = L;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
void displayA(int* nums, int numsSize) {
for (int i = 0; i < numsSize; i++) {
printf("%d ", nums[i]);
}
printf("\n");
}
LN* Merge(LN* head, LN* list) {
LN* last = head;
last->next = list->next;
while (last->next) {
last = last->next;
}
return last;
}
void insert(LN* list, int value) {
LN* prev = list;
LN* curr = list->next;
LN* node = (LN*)malloc(sizeof(LN));
node->data = value;
node->next = NULL;
if (curr == NULL) {
prev->next = node;
} else {
while (curr != NULL && curr->data < value) {
prev = curr;
curr = curr->next;
}
prev->next = node;
node->next = curr;
}
}
void BucketSort(int array[], int size, int num) {
LN** buckets = (LN**)malloc(sizeof(LN*) * num);
for (int i = 0; i < num; i++) {
*(buckets + i) = (LN*)malloc(sizeof(LN));
(*(buckets + i))->next = NULL;
}
int max = array[0];
int min = array[0];
for (int i = 0; i < size; i++) {
if (array[i] > max) {
max = array[i];
}
if (array[i] < min) {
min = array[i];
}
}
int space = ((max - min) / num) + 1;
for (int i = 0; i < size; i++) {
int n = (array[i] - min) / space;
insert(*(buckets + n), array[i]);
}
for (int i = 0; i < num; i++) {
printf("第 %d 个桶数据: ", i);
displayL((*(buckets + i))->next);
}
int index = 0;
for (int i = 0; i < num; i++) {
if ((*(buckets + i))->next != NULL) {
LN* temp = (*(buckets + i))->next;
while (temp != NULL) {
array[index++] = temp->data;
temp = temp->next;
}
}
}
}
int main() {
int array[] = {78,17,39,26,72,94,21,12,23,68};
int size = sizeof(array) / sizeof(int);
int BUCKETNUM = 5;
printf("%d \n", size);
displayA(array, size);
BucketSort(array, size, BUCKETNUM);
displayA(array, size);
return 0;
}