單鏈表快速排序

2022-05-30 17:06:09 字數 1561 閱讀 4134

根據普通快排的思路,選擇1個點為中心點,保證中心點左邊比中心點小,中心點右邊比中心點大即可.

單鏈表的實現為:

1.使第乙個節點為中心點.

2.建立2個指標(p,q),p指向頭結點,q指向p的下乙個節點.

3.q開始遍歷,如果發現q的值比中心點的值小,則此時p=p->next,並且執行當前p的值和q的值交換,q遍歷到鍊錶尾即可.

4.把頭結點的值和p的值執行交換.此時p節點為中心點,並且完成1輪快排

5.使用遞迴的方法即可完成排序

#include#include 

using

namespace

std;

//定義鍊錶節點

struct

_tnode

};////////////////////////////////////

//單鏈表快速排序

/////////////////////////////////

//void quicksort(_tnode* pbegin , _tnode*pend)

_tnode* pfirst =pbegin;

_tnode* psecond = pfirst->pnext;

int nmidvalue = pbegin->nvalue;

//開始排序

while(psecond != pend->pnext && psecond !=null)

psecond = psecond->pnext;

}//更換支點後完成1輪排序

std::swap(pbegin->nvalue , pfirst->nvalue);

quicksort(pbegin , pfirst);

quicksort(pfirst->pnext , pend);//此處的next很重要,不然將導致死迴圈

}void

main()

//檢視未排序前的輸出

plastnode =phead;

for(int ncnt = 0; ncnt < nnodecnt; ++ncnt)

cout

<

//檢視排序輸出

quicksort(phead , phead +nnodecnt);

plastnode =phead;

for(int ncnt = 0; ncnt < nnodecnt; ++ncnt)

plastnode =phead;

//刪除包含head以內的11個節點

for(int ncnt = 0; ncnt <= nnodecnt; ++ncnt)

system(

"pause");

}

排序後的結果:

單鏈表快速排序

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

單鏈表快速排序

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

單鏈表快速排序

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