给出如下关键字序列{321,156,57,46,28,7,331,33,34,63},试按链式基数排序方法,列出每一趟分配和收集的过程。
时间: 2024-05-18 08:10:43 浏览: 91
链式基数排序是一种基于桶排序的排序算法,它将数据按照位数切割成不同的数字,然后按照每个位数分别进行排序。下面是按照链式基数排序方法对给定关键字序列进行排序的过程:
1. 将关键字序列中的数字按照个位数的大小分配到0~9号桶中,得到以下分配过程:
0:
1:321
2:32
3:33 331
4:34
5:156 57
6:46 63
7:7
8:28
9:
2. 将0~9号桶中的数字按照顺序收集起来,得到以下收集过程:
321 32 33 331 34 156 57 46 63 7 28
3. 将关键字序列中的数字按照十位数的大小分配到0~9号桶中,得到以下分配过程:
0:
1:7
2:28
3:32 33 34
4:46
5:57 63
6:
7:321
8:156
9:331
4. 将0~9号桶中的数字按照顺序收集起来,得到以下收集过程:
7 28 32 33 34 46 57 63 321 156 331
5. 将关键字序列中的数字按照百位数的大小分配到0~9号桶中,得到以下分配过程:
0:7 28 32 33 34 46 57 63
1:156
2:
3:321 331
4:
5:
6:
7:
8:
9:
6. 将0~9号桶中的数字按照顺序收集起来,得到以下收集过程:
7 28 32 33 34 46 57 63 156 321 331
经过三趟分配和收集的过程,最终得到了按照链式基数排序方法排好序的关键字序列:{7, 28, 32, 33, 34, 46, 57, 63, 156, 321, 331}。
相关问题
给出关键字序列{ 4321, 56, 57, 46, 28, 7, 331, 33, 234, 63 },下面哪个选择是按次位优先(LSD)链式基数排序进行了一趟分配和收集的结果? A. →4321→331→33→63→234→56→46→57→7→28 B. →57→46→28→7→33→234→63→56→4321→331 C. →56→28→4321→331→33→234→46→57→63→7 D. →331→4321→33→63→234→56→46→57→7→28
根据LSD基数排序的原理,排序是从最低位开始依次进行的,因此我们需要比较关键字序列中最低位的数字,将其分配到对应的桶中,然后再将桶中的数字按顺序收集起来,这样完成一趟排序。根据这个原理,我们可以模拟一下每个选项进行一趟排序的结果,最终发现选项C是正确的。
按C选项进行一趟排序的过程如下:
1. 按个位数字分配到桶中:4321→331→33→63→234→56→46→57→7→28
2. 按桶编号顺序收集:56→28→4321→331→33→234→46→57→63→7
因此,选项C是按次位优先(LSD)链式基数排序进行了一趟分配和收集的结果。
链式基数排序 c语言
链式基数排序是一种基于链表的排序算法,用于对数据进行多关键字排序。它的基本思想是将单个关键字拆分成若干项,并将每一项作为一个新的关键字进行排序。对于整数或字符串类型的关键字,可以将其拆分为单个数字或单个字母。
链式基数排序的具体步骤如下:
1. 定义链结构和链队列结构。
2. 初始化带头结点的链队列。
3. 判断带头结点的链队列是否为空,如果为空则说明排序完成。
4. 从最低位的关键字开始,将序列中的数据根据关键字的不同值分配到不同的队列中。
5. 按关键字从小到大(升序)收集起来。
6. 重复上述步骤,直到最高位分配—收集完成,此时序列有序。
下面是一个示例代码的实现:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_DIGIT 10 // 假设关键字的最大位数为10
// 定义链结构
typedef struct node {
int data;
struct node* next;
} Node;
// 定义链队列结构
typedef struct queue {
Node* front; // 队头指针
Node* rear; // 队尾指针
} Queue;
// 初始化带头结点的链队列
void initQueue(Queue* q) {
q->front = q->rear = (Node*)malloc(sizeof(Node));
q->front->next = NULL;
}
// 判断带头结点的链队列是否为空
int isQueueEmpty(Queue* q) {
return (q->front == q->rear);
}
// 带头结点的链队列入队操作
void enqueue(Queue* q, int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
newNode->next = NULL;
q->rear->next = newNode;
q->rear = newNode;
}
// 带头结点的链队列出队操作
int dequeue(Queue* q) {
if (isQueueEmpty(q)) {
printf("Error: Queue is empty\n");
exit(EXIT_FAILURE);
}
Node* temp = q->front->next;
int data = temp->data;
q->front->next = temp->next;
if (q->rear == temp) { // 若删除的是最后一个结点,则修改队尾指针
q->rear = q->front;
}
free(temp);
return data;
}
// 取关键字的某一位的值
int getDigit(int num, int digit) {
int i;
for (i = 0; i < digit; i++) {
num /= 10;
}
return num % 10;
}
// 检索表中最大的值是几位数
int getMaxDigit(int* arr, int length) {
int maxDigit = 1;
int i;
for (i = 1; i < length; i++) {
if (arr[i > arr[i - 1]) {
maxDigit = arr[i];
}
}
int digit = 0;
while (maxDigit) {
maxDigit /= 10;
digit++;
}
return digit;
}
// 基数排序算法的实现
void radixSort(int* arr, int length) {
int maxDigit = getMaxDigit(arr, length);
int i, j, k;
Queue queues
阅读全文