1. 程式人生 > 其它 >港股和美股免費api介面(整理自網路)

港股和美股免費api介面(整理自網路)

摘自:https://blog.csdn.net/bigtree_3721/article/details/82945924

 

一般人見到這種題目,立馬就會想到指標交換。是的,大家被指標交換的題目做多了,形成思維定勢了。對於這道題,我們完全可以利用值交換來達到排序的目的。當然,怎麼值交換?   

 很多人得第一想法就是選擇排序,這個木有問題,不過它的複雜度為O(n^2);

有木有更好一點的方法呢?歸併,不錯,歸併確實能將複雜度降到O(nlogn)不過,它是是連結串列交換的形式,我們這裡提到的是要用值交換的形式。

還有別的方法嗎?對了,快排!怎麼會是快排?快排不是需要一個指標指向頭,一個指標指向尾,然後兩個指標相向運動並按一定規律交換值,最後找到一個支點使得支點左邊小於支點,支點右邊大於支點嗎?是滴,木有錯,不過問題出來了。如果是這樣的話,對於

單鏈表我們沒有前驅指標,怎麼能使得後面的那個指標往前移動呢?所以這種快排思路行不通滴。

如果我們能使兩個指標都往next方向移動並且能找到支點那就好了。怎麼做呢?接下來我們使用快排的另一種思路來解答。我們只需要兩個指標p和q,這兩個指標均往next方向移動,移動的過程中保持p之前的key都小於選定的key,p和q之間的key都大於選定的key,那麼當q走到末尾的時候便完成了一次支點的尋找。

 

#include "LinkList.h"

void Swap(LinkList* node0, LinkList* node1) {
    int temp = node0->val;
    node0->val = node1->val;
    node1->val = temp;
}

void QuickSort(LinkList* head, LinkList* tail) {
    if (head == NULL || head == tail) {
        return;
    }

    int temp = head->val;
    LinkList* p = head;
    LinkList* pre = head;
    LinkList* q = head;

    while(q != tail) {
        q = q->next;
        if (q == NULL) {
            break;
        }
        if (q->val < temp) {
            pre = p;
            p = p->next;
            Swap(p, q);
        }
    }
    Swap(head, p);
    QuickSort(head, pre);
    QuickSort(p->next, tail);
}

int main() {
    int a[] = {57, 68, 59, 52, 72, 28, 96, 33, 24};
    int len = sizeof(a) / sizeof(a[0]);
    LinkList* list = LinkListUtil::create(a, len);
    LinkListUtil::print(list);
    QuickSort(list, NULL);
    LinkListUtil::print(list);
    return 0;
}