快排,非遞迴 單鏈表快排 單鏈表歸併

2021-06-01 04:59:11 字數 1707 閱讀 4826

筆面的高頻問題。又是現場沒答出來,回來再馬後炮:

用棧實現:

1。每次把支點的右段入棧(當然只記錄該段的起始與結束標記);

2。然後繼續對支點的左段重複過程1,若左段的元素小於2個,則不需要再重複1,轉到3;

3。左段已排好,從棧中取出最新的右段,轉到1,若棧空則結束。

**如下:

// helloworld.cpp : 定義控制台應用程式的入口點。

//#include "stdafx.h"

#include static int cnt = 0; //記錄分段函式執行的次數

int div(int* a,int s,int e) //找到支點的位置,這和遞迴寫法是一樣的

a[s] = temp;

return s;

}void qs(int* a,int s,int e)

ln;void showln(ln* head)

coutpnext;

ln * pivot = head->pnext ; //支點的值

while( cur != rear )

else

}else

else

}cur = cur->pnext;

} if( lefthead )

else

head->pnext = pivot;

if( righthead )

else

pivot->pnext = rear;

return pivot;

}void qs(ln* head,ln* rear)

int _tmain(int argc,char* argv)

; ln a[n];

for (int i=0;i0)

a[i-1].pnext = a+i; }

head->pnext = a;

a[n-1].pnext = rear;

qs(head,rear);

showln(head);

return 0;

}

單鏈表歸併排序

歸併排序的輔助空間o(1),對於單鏈表,歸併排序的實現比快排要簡單,以下是**:

typedef struct _node

node;

//將已各自排好序,並由head1,head2為頭指標的鍊錶合併,返回新的頭指標

node* merge(node* head1,node* head2)

if (pre1) pre1->next = head2;

if(head1==null) break;

while( head2!=null && head2->data < head1->data)

if (pre2) pre2->next = head1;

} return newhead;

}node* msort(node *head, int n)

node *mid=head;

int len1 = n/2,len2=n-len1;

for (int i=0;inext;

node *head1 = msort(head,len1);

node *head2 = msort(mid,len2);

return merge(head1,head2);

}

單鏈表的快排

單鏈表的快排和普通快排都是快排 1.移動數 partition 使得左邊的都小於key,右邊的都大於key 2.反覆 下面是正常陣列的快排 def arr sort self,vector,start,end start,end 0,len vector 1 i,j start end if i j...

單鏈表實現快排

快排的思想 以乙個點為分割點,將陣列分割成前半部分比這個點小,後半部分比這個點大的兩部分,然後再遞迴對這兩半段進行上述同樣的操作,然後合起來 此處一般直接在原陣列中進行操作,交換元素 是一種分治的思想。轉移到鍊錶上 以乙個點為分割點,將鍊錶分割成比這個點大的大鍊錶部分,乙個比這個點小的小鍊錶部分,然...

單鏈表排序 快排 歸併排序

題目描述 給定乙個亂序的單鏈表的頭節點,對該鍊錶中的節點進行排序 要求時間複雜度為o nlgn 空間複雜度為o 1 分析 由於題目要求時間複雜度我o nlgn 因此選擇排序和插入排序可以排除。在排序演算法中,時間複雜度為o nlgn 的主要有 歸併排序 快速排序 堆排序。其中堆排序的空間複雜度為 n...