链表快速排序

链表快速排序

大致思想是通过一个指针数组转化为常规数组快速排序,最后再重新梳理链表。

#include <iostream>
#include <vector>
using namespace std;

typedef struct NODE{
    int data;
    NODE* next;
    NODE(int _data) : data(_data), next(nullptr){}
}NODE;

NODE* createLinkTable()
{
    const int tableLen = 10;
    const int testArray[tableLen] = { 12, 32, 0, 45, 2, 78, 34, 8, 365, 7 };
    NODE* root = new NODE(testArray[0]);
    NODE* prev = root;
    for (int i = 1; i < tableLen; i++)
    {
        NODE* cur = new NODE(testArray[i]);
        prev->next = cur;
        prev = cur;
    }
    return root;
}
void destroyLinkTable(NODE* table)
{
    NODE* iter = table;
    while (iter)
    {
        NODE* next = iter->next;
        delete iter;
        iter = next;
    }
}
void sortLinkTable(vector<NODE*>& linkVec,const int left,const int right)
{
    if (left >= right)
    {
        return;
    }
    NODE* flag = linkVec[right];
    int leftIter = left;
    int rightIter = left;
    for (int i = left; i < right-1; i++)
    {
        if (linkVec[i]->data < flag->data)
        {
            swap(linkVec[leftIter], linkVec[i]);
            leftIter++;
        }
        else{
            rightIter++;
        }
    }
    if (linkVec[leftIter]->data > linkVec[right]->data)
    {
        swap(linkVec[leftIter], linkVec[right]);
    }

    sortLinkTable(linkVec, left, leftIter-1);
    sortLinkTable(linkVec, leftIter + 1, right);
}
NODE* rebuildLinkTable(vector<NODE*>& linkVec)
{
    NODE* root = linkVec[0];
    NODE* prev = root;
    for (size_t i = 1; i < linkVec.size(); i++)
    {
        prev->next = linkVec[i];
        prev = linkVec[i];
    }
    prev->next = nullptr;

    return root;
}
NODE* sortLinkTable(NODE* table)
{
    vector<NODE*> linkVec;
    NODE* cur = table;
    while (cur)
    {
        linkVec.push_back(cur);
        cur = cur->next;
    }
    sortLinkTable(linkVec, 0, linkVec.size()-1);
    return rebuildLinkTable(linkVec);
}
void displayLinkTable(const NODE* const table)
{
    const NODE* iter = table;
    while (iter)
    {
        cout << iter->data << " ";
        iter = iter->next;
    }
    cout << endl;
}
int main(int argc, char* argv[])
{
    NODE* table = createLinkTable();
    if (!table)
    {
        return -1;
    }
    displayLinkTable(table);
    table = sortLinkTable(table);
    displayLinkTable(table);
    destroyLinkTable(table);
    return 0;
}
posted @ 2014-06-18 17:22  *神气*  阅读(732)  评论(0编辑  收藏  举报