C语言双向链表 快速排序

/********************************************************************
* File Name  : quick_sort.c                                                                 *
* Created   : 2007/05/08                                                                      *
* Author   :    SunYonggao                                                                   *
* Description  :  对双向链表进行快速排序
*********************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

//定义类型 所有的排序例子中都是用的int作为data
typedef int elemType;     

//返回值
#define RET_SUCCESS   ( 1  ) 
#define RET_FAILED   ( 0  )  

//定义链表的长度
#define  LIST_MAX_SIZE      (10)

//定义链表申请内存不够时报错信息
#define NO_MEMORY   printf("Error! Not enough memory!/n");exit(1)

//双向链表结构体定义
typedef struct tagDuNode_t
{
 elemType data;     

  • 1
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
以下是 C 语言双向链表快速排序实现: ```c #include <stdio.h> #include <stdlib.h> typedef struct node { int val; struct node *prev; struct node *next; } Node; Node *partition(Node *head, Node *tail) { int pivot = tail->val; Node *i = head->prev; for (Node *j = head; j != tail; j = j->next) { if (j->val <= pivot) { i = (i == NULL) ? head : i->next; int tmp = i->val; i->val = j->val; j->val = tmp; } } i = (i == NULL) ? head : i->next; int tmp = i->val; i->val = tail->val; tail->val = tmp; return i; } void quick_sort(Node *head, Node *tail) { if (tail != NULL && head != tail && head != tail->next) { Node *p = partition(head, tail); quick_sort(head, p->prev); quick_sort(p->next, tail); } } void print_list(Node *head) { while (head != NULL) { printf("%d ", head->val); head = head->next; } printf("\n"); } int main() { Node *head = (Node *)malloc(sizeof(Node)); head->val = 5; head->prev = NULL; head->next = (Node *)malloc(sizeof(Node)); head->next->val = 2; head->next->prev = head; head->next->next = (Node *)malloc(sizeof(Node)); head->next->next->val = 8; head->next->next->prev = head->next; head->next->next->next = (Node *)malloc(sizeof(Node)); head->next->next->next->val = 3; head->next->next->next->prev = head->next->next; head->next->next->next->next = NULL; printf("Before sorting: "); print_list(head); quick_sort(head, head->next->next->next); printf("After sorting: "); print_list(head); return 0; } ``` 解释: - `partition` 函数实现了快速排序的分区操作,其输入参数为链表头和尾节点,返回值为分区点; - `quick_sort` 函数实现了快速排序的递归操作; - `print_list` 函数用于打印链表; - 在 `main` 函数中初始化了一个双向链表,并对其进行排序。 注意: - 在 `partition` 函数中,我们选择尾节点作为基准点(pivot),这是快速排序的常规选择; - 在 `partition` 函数中,我们使用了一种经典的双指针算法,分别指向小于等于基准点和大于基准点的元素; - 在 `partition` 函数中,我们使用了链表节点值的交换,而不是节点指针的交换,因为我们需要维护链表节点的 prev 和 next 指针; - 在 `quick_sort` 函数中,我们需要判断链表头和尾是否相等,以及链表头是否为尾的下一个节点,这是递归终止条件; - 在 `main` 函数中,我们需要手动创建链表并初始化,这是为了方便演示。在实际应用中,链表可能是从其他函数或模块中传入的,或者是动态创建的。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值