单链表快速排序

//#include <iostream>
#include "stdio.h"
#include "stdlib.h"
//using namespace std;
//构造结点并初始化
typedef struct node 
{
    int val;
   struct node * next;
}mynode,*pmynode,node;
 
void swap(int* a,int * b)
{
   int tmp  = *a; 
   * a  = *b;
   * b = tmp ;
}
//定位
node *partion(node *pbegin ,node * pend)
{
    if(pbegin ==pend )
    
           return pbegin;
    int mykey = pbegin ->val;
    node * p =pbegin ; 
    node* q =pbegin;
    while(q != NULL)
    {

        if(q->val< mykey )
        {
            p = p->next;
            //这两种交换写法都是正确的
            //swap( &(p->val) ,&(q ->val)); //小于则交换
              swap( &p->val ,&q ->val); //小于则交换
        }
        q =q ->next;//否则一直往下走
    }
    swap(&p->val,&pbegin->val); //定位
    return p;
}
void quick_sort(node *pbegin,node *pend)
{
    if(pbegin ==pend || pbegin == NULL || pend == NULL)
    
        return ;
    node *mid =partion(pbegin,pend);
    quick_sort(pbegin,mid);
    
    quick_sort(mid->next,pend);
}
 
node *mysort(node *head,node *end)
{    //如果头结点为空,则直接跳出循环
    //if(head ==NULL ||head -> next==NULL);
       //return head;
    quick_sort(head ,end);
    return head;
}
 
int main()
 {
    node a = {
        .val = 37,
        .next = NULL,
    };
    node b = {
        .val = 4,
        .next = NULL,
    };

    
    node c = {
        .val = 6,
        .next = NULL,
    };
    node d = {
        .val = 2,
        .next = NULL,
    };
    node e = {
        .val = 5,
        .next = NULL,
    };
    node f = {
        .val = 7,
        .next = NULL,
    };
    a.next = &b;
    b.next = &c;
    c.next = &d;
    d.next = &e;
    e.next = &f;
 
    //swap( & b->val ,& c->val);
    pmynode head = & a;
   // printf("%d\n", head->val);
   // printf("%d\n", (&a)->val);
    //printf("%d", &a->val);
   //如果节点的指针不为空则打印节点
    while(head)
    {
        printf("%d \t",head ->val);
        head =head -> next;
       
    }
    printf("\n");
   // pmynode head0 =mysort(head,&f);
    pmynode head0 =mysort(&a,&b);
    while(head0)
    {
        printf("%d \t",head0 ->val);
        head0 =head0 -> next;
    }
    printf("\n");
    
    return 0;
 }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值