單鏈表的快速排序

2021-06-01 06:31:02 字數 1099 閱讀 1353

單鏈表的快速排序和陣列的快速排序在基本細想上是一致的,以從小到大來排序單鏈表為例,

都是選擇乙個支點,然後把小於支點的元素放到左邊,把大於支點的元素放到右邊。

但是,由於單鏈表不能像陣列那樣隨機儲存,和陣列的快排序相比較,還是有一些需要注意的細節:

1. 支點的選取,由於不能隨機訪問第k個元素,因此每次選擇支點時可以取待排序那部分鍊錶的頭指標。

2. 遍歷量表方式,由於不能從單鏈表的末尾向前遍歷,因此使用兩個指標分別向前向後遍歷的策略實效,

事實上,可以可以採用一趟遍歷的方式將較小的元素放到單鏈表的左邊。具體方法為:

1)定義兩個指標pslow, pfast,其中pslow指單鏈表頭結點,pfast指向單鏈表頭結點的下乙個結點;

2)使用pfast遍歷單鏈表,每遇到乙個比支點小的元素,就和pslow進行資料交換,然後令pslow=pslow->next。

3. 交換資料方式,直接交換鍊錶資料指標指向的部分,不必交換鍊錶節點本身。

基於上述思想的單鏈表快排序實現如下:

‍#include

#include

using namespace std;

//單鏈表節點

struct slist

; void bulid_slist(slist** phead, int n)

else}}

slist* get_last_slist(slist* phead)

return ptr;

} void print_slist(slist* phead)

printf("\n");

} void sort_slist(slist* phead, slist* pend)

pfast = pfast->next;

}swap(phead->data, pslow->data);

sort_slist(phead, ptemp);//ptemp為左右兩部分分割點的前乙個節點

sort_slist(pslow->next, pend);

void destroy_slist(slist* phead)

}int main(int argc, char** argv)

單鏈表快速排序

今天在學習 程式設計師使用演算法 時,看到了單鏈表快排序這一節。初看時感覺程式有很大的問題,但是細細品味之後卻發現程式設計的極為巧妙,同時又深感自己c語言指標知識之不牢固,特別是指標的指標方面的知識。單鏈表的快排序和陣列的快排序基本思想相同,同樣是基於劃分,但是又有很大的不同 單鏈表不支援基於下標的...

單鏈表快速排序

今天在學習 程式設計師使用演算法 時,看到了單鏈表快排序這一節。初看時感覺程式有很大的問題,但是細細品味之後卻發現程式設計的極為巧妙,同時又深感自己c語言指標知識之不牢固,特別是指標的指標方面的知識。單鏈表的快排序和陣列的快排序基本思想相同,同樣是基於劃分,但是又有很大的不同 單鏈表不支援基於下標的...

單鏈表快速排序

今天在學習 程式設計師使用演算法 時,看到了單鏈表快排序這一節。初看時感覺程式有很大的問題,但是細細品味之後卻發現程式設計的極為巧妙,同時又深感自己c語言指標知識之不牢固,特別是指標的指標方面的知識。單鏈表的快排序和陣列的快排序基本思想相同,同樣是基於劃分,但是又有很大的不同 單鏈表不支援基於下標的...