链表的归并排序、快速排序、冒泡排序、选择排序

一  链表的快速排序

代码如下:

void swap(ListNode* a,ListNode* b)
{
    int tmp = a->value;
    a->value = b->value;
    b->value = tmp;
}
ListNode* partitonlist(ListNode* begin,ListNode* end)
{
    if(begin==NULL||begin->next==NULL)
        return begin;
        ListNode* p = begin;
        ListNode* q = begin->next;
        int key = p->value;
        while(q!=end)
        {
            if(q->value<key)
            {
                p=p->next;
                swap(p,q);

            }
            q=q->next;
        }
        //swap(begin,p);
        return p;
}

void quickSort(ListNode* begin,ListNode* end)
{
    if(begin!=end)
    {
        ListNode* pivot=partitonlist(begin,end);
        partitonlist(begin,pivot);
        partitonlist(pivot->next,end);
    }
}

ListNode* createList(const vector<int> num)
{
    ListNode* dummy=new ListNode(INT_FAST64_MIN);
    ListNode* p=dummy;
    const int n=num.size();
    for(unsigned i=0;i<n;++i)
    {
        ListNode* t=new ListNode(num[i]);
        p->next=t;
        p=t;
    }
    return dummy->next;
}

二 链表的归并排序

代码如下:

ListNode* mergeSortedList(ListNode *L1, ListNode *L2)
{
     ListNode dummy(-1), *p1 = &dummy, *p2 = L2;  //L1的辅助头结点dummy,因为可能在头部插入
     dummy.next = L1;
     while(p1->next != NULL && p2 != NULL)  //停止条件,也包括了判断两个链表是否为空
    {
         if(p1->next->value >= p2->value)
        {
            L2 = p2->next;
             p2->next = p1->next;
            p1->next = p2;
            p1 = p2;
            p2 = L2;
         }
         else
         {
             p1 = p1->next;
         }
    }
     if(p1->next == NULL)    //L2可能还有未处理的结点,直接加在L1尾部即可
     {
         p1->next = p2;
     }
      return dummy.next;
}

ListNode *listMergeSort(ListNode *head)
{
    if(head == NULL || head->next == NULL)   //链表为空,或者只有一个结点,直接返回
        return head;

    ListNode *slow = head, *fast = head;
    while(fast->next != NULL && fast->next->next != NULL)
    {
        fast = fast->next->next;
        slow = slow->next;
    }

    ListNode *leftHead = head, *rightHead = slow->next;
    slow->next = NULL;      //需要把左半链表的尾结点的next赋空值,所以用一个变量来记录右半链表的头

    leftHead  = listMergeSort(leftHead);
    rightHead = listMergeSort(rightHead);

    return mergeSortedList(leftHead, rightHead);
}

三 链表的冒泡排序

代码如下:

void bubbleSort(ListNode* head)//
{
    if(head==NULL||head->next==NULL) return;
    for(ListNode* p=head;p!=NULL;p=p->next)
    {
        for(ListNode* q=p->next;q!=NULL;q=q->next)
        {
            if(p->value>q->value)
            {
                int x=p->value;
                p->value=q->value;
                q->value=x;
            }
        }
    }
}

四 链表的选择排序

代码如下:

void selectSort(ListNode* head)//
{
    if(head==NULL||head->next==NULL) return;
    for(ListNode* p=head;p!=NULL;p=p->next)
    {
        ListNode* tmp=p;
        for(ListNode* q=p->next;q!=NULL;q=q->next)
        {
            if(tmp->value>q->value)
            {
                tmp=q;
            }
        }
        if(p!=tmp)
        {
            int x=p->value;
            p->value=tmp->value;
            tmp->value=x;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值