1. 程式人生 > 其它 >淺談快速排序(假設處理陣列)--樞紐點的選擇的任意性

淺談快速排序(假設處理陣列)--樞紐點的選擇的任意性

引言:

  快速排序由於排序效率在同為O(N*logN)的幾種排序方法中效率較高,因此經常被採用,再加上快速排序思想----分治法也確實實用
因此很多軟體公司的筆試面試,包括像騰訊,微軟等知名IT公司都喜歡考這個,還有大大小的程式方面的考試如軟考,考研中也常常出現快速排序的身影。
  但大多數快速排序樞紐點的選擇都會選擇第一個元素,對於一些喜歡探索的學者來說他們都喜歡變換一下這個樞紐點的選擇,
接下來我就我自己的觀點分享一下我的觀點。這邊如果對快速排序有些遺忘的同學,我建議大家可以看一下這個連結https://www.runoob.com/w3cnote/quick-sort.html的內容回顧一下。

正文:

首先我想先說明一下我的觀點:
  對於那些喜歡用第一個元素的作為樞紐的原因大部分是因為可以寫成可以實際執行且正確的程式碼,巧妙的利用分治法,面對處理的陣列長度逐漸減少時不會產生因樞紐點選擇而造成錯誤。
  對於任意選擇樞紐點進行快速排序也是可行的,但很難用程式碼很流暢的寫出處理快速排序的全過程,只能分開的確定每次分治時要選擇的一個一個去處理。
  比如當你選擇第5個元素作為樞紐點對於那些陣列小於5的陣列來說就不太合適。

下面給出任意樞紐點的一次排序程式碼:param 為樞紐點的位置 其餘的與一般的快速排序相似。

   public static int s(int[] a,int low,int high,int param) {		
	int rr=param+low;//獲取的指定區間樞紐點選擇的位置
	int p=low,q=high,r=a[rr];//儲存樞紐點的值		
	while(p<q) {
		while(p<q&&a[q]>=r) --q;
		if(p<q) {
		a[rr]=a[q];
		rr=q;//通過rr引數動態的指向下一次移動到的位置
		}
		while(p<q&&a[p]<=r) ++p;
		if(p<q) {
		a[rr]=a[p];
		rr=p;
		}
	}
	a[rr]=r;
	return rr;
	
}