筆面的高頻問題。又是現場沒答出來,回來再馬後炮:
用棧實現:
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...