编写一段c语言程序,有一个顺序表L,假设元素类型ElemType为整型,设计一个尽可能高效的算法,以第一个元素为分界线(基准),将所有小于等于它的元素移到该基准的前面,将所有大于它的元素移到该基准的后面。 思路:交换
时间: 2024-10-15 11:20:49 浏览: 20
c语言 数据结构实验二 顺序表的应用
在C语言中,你可以使用两个指针分别指向列表的开始和结束,然后根据基准元素遍历列表并进行交换操作。这是一个经典的快速排序的划分过程,可以应用于有序列表的优化。以下是简单的代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
// 指定元素类型
typedef struct {
int value;
struct Node *next;
} ListNode;
// 插入节点到链表
void insert(ListNode **head, int value) {
ListNode *newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->value = value;
newNode->next = *head;
*head = newNode;
}
// 交换两个节点的值
void swap(ListNode *a, ListNode *b) {
int temp = a->value;
a->value = b->value;
b->value = temp;
}
// 分割列表函数
void partition(ListNode **head, ListNode *pivot) {
ListNode *smaller = head, *current = *head;
while (current != NULL && current->value <= pivot->value) {
smaller = current;
current = current->next;
}
if (smaller != *head) { // 如果找到了分割点
swap(smaller, pivot);
}
pivot->next = *head; // 将基准元素放到头的位置
*head = smaller; // 新的头指向分割点
}
// 对整个序列进行分区操作
void quickSortPartition(ListNode **head, ListNode *end, ListNode *pivot) {
if (head != end) {
ListNode *partitionPoint = partition(head, pivot);
quickSortPartition(head, partitionPoint - 1, pivot);
quickSortPartition(partitionPoint + 1, end, pivot);
}
}
int main() {
// 创建一个顺序表示例
ListNode *list = NULL, *node1 = NULL, *node2 = NULL, *node3 = NULL;
insert(&list, 5); // 假设第一个元素为基准
insert(&list, 3);
insert(&list, 7);
insert(&list, 2);
insert(&list, 6);
// 设置基准元素
ListNode *pivot = list;
quickSortPartition(&list, &list, pivot);
// 打印排序后的链表
ListNode *temp = list;
while (temp != NULL) {
printf("%d ", temp->value);
temp = temp->next;
}
return 0;
}
阅读全文