單鏈表的快速排序和陣列的快速排序在基本細想上是一致的,以從小到大來排序單鏈表為例,
都是選擇乙個支點,然後把小於支點的元素放到左邊,把大於支點的元素放到右邊。
但是,由於單鏈表不能像陣列那樣隨機儲存,和陣列的快排序相比較,還是有一些需要注意的細節:
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語言指標知識之不牢固,特別是指標的指標方面的知識。單鏈表的快排序和陣列的快排序基本思想相同,同樣是基於劃分,但是又有很大的不同 單鏈表不支援基於下標的...