写出一个适用于计数排序的顺序表的 c语言
时间: 2024-11-27 17:21:40 浏览: 11
计数排序是一种非比较型整数排序算法,它特别适合于处理一定范围内的整数数据。在 C 语言中,我们可以创建一个顺序表结构体并配合计数数组来实现计数排序。以下是一个简单的例子:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义顺序表结构体
typedef struct {
int *data; // 存储元素的数组
int size; // 当前元素个数
int capacity; // 序列的最大容量
} SequenceList;
// 计数排序函数
void countingSort(SequenceList *list, int max_value) {
int count[max_value + 1] = {0}; // 初始化计数数组
for (int i = 0; i < list->size; ++i) {
count[list->data[i]]++; // 统计每个值的频次
}
for (int i = 1; i <= max_value; ++i) {
count[i] += count[i - 1]; // 更新累计计数
}
int sorted_index = 0;
for (int i = list->size - 1; i >= 0; --i) {
list->data[sorted_index++] = list->data[i]; // 将元素移到已排序部分
count[list->data[i]]--; // 减少对应计数值
if (count[list->data[i]]) {
list->data[--count[list->data[i]]] = list->data[i]; // 调整未排序部分的元素位置
}
}
}
// 测试及添加/删除元素
void ListOperation(SequenceList *list, int* arr, int n, int operation, int value) {
switch(operation) {
case 1: // 添加元素
if (list->size < list->capacity) {
list->data[n] = value;
list->size++;
} else {
printf("Error: List is full.\n");
}
break;
case 2: // 删除元素
if (value != -1 && n < list->size) {
for (int i = n; i < list->size - 1; ++i)
list->data[i] = list->data[i+1];
list->data[list->size-1] = -1; // 表示列表结束
list->size--;
} else {
printf("Error: Invalid input.\n");
}
break;
default:
printf("Error: Invalid operation.\n");
}
}
int main() {
SequenceList list = {NULL, 0, 10}; // 初始化顺序表
int arr[] = {4, 2, 2, 8, 3, 3, 1};
int n = sizeof(arr) / sizeof(arr[0]);
// 对arr进行计数排序
countingSort(&list, *max_element(arr, arr + n));
// 打印排序后的顺序表
for (int i = 0; i < list.size; ++i) {
printf("%d ", list.data[i]);
}
printf("\n");
return 0;
}
```
在这个例子中,我们首先定义了一个顺序表结构,并实现了计数排序算法。然后提供了一些操作函数来向列表添加或删除元素。`main` 函数展示了如何对给定的整数数组进行计数排序,并打印排序后的结果。
阅读全文