時間複雑度O(nlogn)を実現するチェーンテーブル並べ替えアルゴリズム

5564 ワード

概要
チェーンテーブルのソートは一般的なチェーンテーブルに関するアルゴリズム問題であり、バブルソートまたはソートの2つのアルゴリズムを使用してこの問題を解決することが多い.しかしそれらの時間的複雑さはO(n²),効率が悪い.したがって,今日我々が時間複雑度O(nlogn)を実現するアルゴリズムでは,この2つのソートアルゴリズムを選択することはできない.この時間の複雑さを満たすソートアルゴリズムは,高速ソート,スタックソート,集計ソートのみである.しかし,高速配列とスタック配列は不安定であるため,チェーンテーブル並べ替え問題を実現するために集計並べ替えアルゴリズムを選択した.
集計ソートについては、以前ブログを書いたことがありますが、アルゴリズムの考え方を紹介しています.http://blog.csdn.net/mbuger/article/details/65451607
コード実装を以下に示す
class ListNode 
{//    
public:
    int val;
    ListNode *next;
    ListNode(int val) 
    {
        this->val = val;
        this->next = NULL;
    }   
};

ListNode* SortList(ListNode* head)
{
    if (head == NULL || head->next == NULL)
        return head;

    ListNode* fast;
    ListNode* slow;

    while (fast->next != NULL && fast->next->next != NULL)
    {//             
        fast = fast->next;
        fast = fast->next;
        slow = slow->next;
    }

    ListNode* mid = slow->next;
    slow->next == NULL;//           

    //    ,  
    ListNode* list1 = SortList(head);
    ListNode* list2 = SortList(mid);

    ListNode* sorted = Merge(list1, list2);
    return sorted;
}

ListNode* Merge(ListNode* list1, ListNode* list2)
{//  
    if (list1 == NULL)
        return list2;
    if (list2 == NULL)
        return list1;

    ListNode* head;
    ListNode* tmp;

    if (list1->val < list2->val)
    {
        head = list1;
        list1 = list1->next;
    }
    else
    {
        head = list2;
        list2 = list2->next;
    }

    tmp = head;

    while (list1 && list2)
    {
        if (list1->val < list2->val)
        {
            tmp->next = list1;
            tmp = tmp->next;
            list1 = list1->next;
        }
        else
        {
            tmp->next = list2;
            tmp = tmp->next;
            list2 = list2->next;
        }
    }

    if (list1 == NULL)
    {
        tmp->next = list2;
    }
    if (list2 == NULL)
    {
        tmp->next = list1;
    }

    return head;
}