根據普通快排的思路,選擇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語言指標知識之不牢固,特別是指標的指標方面的知識。單鏈表的快排序和陣列的快排序基本思想相同,同樣是基於劃分,但是又有很大的不同 單鏈表不支援基於下標的...