leetcode 148 链表排序

LeetCode148

#include<iostream>
#include<stack>
#include<queue>
using namespace std;

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
    ListNode *partion(ListNode *low, ListNode*high)
    {
        ListNode * i;
        ListNode * pos = low;
        int key = low->val;
        for (i = low->next; i != high; i = i->next)
        {
            if (i->val <= key)
            {
                pos = pos->next;
                swap(i->val,pos->val);
            }
        }
        swap(pos->val,low->val);
        return pos;
    }

    void qsort(ListNode*head, ListNode*tail)
    {
        if(head != tail && head->next != tail)
        {
            ListNode* mid = partion(head, tail);
            qsort(head, mid);
            qsort(mid->next, tail);
        }
    }

    ListNode* sortList(ListNode* head) {
        if (head == NULL || head->next == NULL)
            return head;
        qsort(head,NULL);
        return head;
    }
};



int main()
{
    //int a[3] = {1,2,3};
    //int b[3] = {1,2,3};
    ListNode *a,*b,*c,*d,*e,*f;
    a = new  ListNode(1);
    b = new  ListNode(2);
    c = new  ListNode(-1);
    d = new  ListNode(1);
    e = new  ListNode(3);
    f = new  ListNode(4);
    a->next = b;
    b->next = c;
    c->next = d;
    d->next = e;
    e->next = f;
    Solution s;
    ListNode * res = s.sortList(a);
    while(res)
    {
        cout << res->val;
        res = res->next;
    }
    cout << endl;

    return 0;
}

来个非链表的

#include<iostream>
using namespace std;

typedef bool(*cmp_fun)(int, int);

bool cmp_func_dec(int a, int b)
{
    return (a > b);
}

bool cmp_func_asc(int a, int b)
{
    return (a < b);
}

int partion(int arr[],int low,int  high,cmp_fun func)
{
    int key = arr[low];
    int  pos = low;
    int i;
    for (i=low+1; i<high; i++)
    {
        if (func(arr[i],key))
        {
            pos++;
            swap(arr[i],arr[pos]);
        }
    }
    swap(arr[pos],arr[low]);
    return pos;
}
void qsort(int arr[],int start,int end1,cmp_fun func)
{
    if (end1 <= start)return;
    int pos = partion(arr,start,end1,func);
    qsort(arr,start,pos,func);
    qsort(arr,pos+1,end1,func);
}

int main()
{
    int a[5] = {1,1,2,1,3};
    cout <<"sort asc:";
    cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<" "<<a[3]<<" "<<a[4]<<" ==> ";
    qsort(a,0,5,cmp_func_asc);
    cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<" "<<a[3]<<" "<<a[4]<<endl;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值