思路一:
第一種是根據演算法導論上的思想:取陣列的最後乙個元素為主元,i初始化為最低位元素的前乙個位置,j指向遍歷陣列中待排序的元素,當j所指元素比主元小的時候i= i + 1,然後交換i和j所指的元素,j不斷遍歷,遇到小於主元的就進行交換,這樣就能一直維持這樣乙個序列,i之前的元素(包括i所指元素本身)都是比主元小的元素,i到j之間都是比主元大的元素,j(包括j所指元素)之後都是待排序的元素,最後交換主元和第乙個比主元大的元素就可以完成劃分。
演算法導論具體介紹如下:
快速排序是基於分治模式處理的,對乙個典型子陣列a[p…r]排序的分治過程為三個步驟:
具體實現快速排序的偽**:
具體例子分析詳情:
c++**實現如下:
//1、進行區域的劃分
int getpartition(vector
&nums, int low, int height)
}swap(nums[i + 1], nums[height]);
return i+1;
}//2、遞迴呼叫劃分區域函式,進行快速排序
void quicksort(vector
&nums,int low,int height)
}
思路二:第二種是嚴蔚敏的資料結構(c語言版)上的思想:取陣列的第乙個元素為主元,左(left)、右(height)兩指標進行遍歷,先右邊開始邊查詢比主元小的(比主元大時height直接減減),找到就直接覆蓋左邊所指的元素,然後從左邊開始查詢比主元大的元素,找到就直接覆蓋右邊所指的元素,依次迴圈進行。最後low不小於height時把所取的主元付給low所指的位置,完成劃分。
資料結構(c語言版)具體介紹如下:
具體實現快速排序的偽**:
具體例子分析詳情:
c++**實現如下:
//1、進行區域的劃分
int getpartition(vector
&nums, int low, int height)
nums[low] = keyval;
return low;
}//2、遞迴呼叫劃分區域函式,進行快速排序
void quicksort(vector
&nums,int low,int height)
}
void quicksortnonrecursive(vector
&nums, int low, int height)
if (mid+1
1); s.push(height);
}while (!s.empty())
if (pqmid + 1
< qheight)}}
}
其實經過測試非遞迴的演算法比遞迴實現還要慢。 因為遞迴演算法使用的棧由程式自動產生,棧中包含:函式呼叫時的引數和函式中的區域性變數。如果區域性變數很多或者函式內部又呼叫了其他函式,則棧會很大。每次遞迴呼叫都要操作很大的棧,效率自然會下降。而對於非遞迴演算法,每次迴圈使用自己預先建立的棧,因此不管程式複雜度如何,都不會影響程式效率。但是對於上面的快速排序,由於區域性變數只有乙個mid,棧很小,所以效率並不比非遞迴實現的低。
具體的關於快速排序的優化,提高快排效率,詳見文章快排優化。
快速排序的兩種實現方式(遞迴 非遞迴)
ifndef quick sort h define quick sort h include include include 快速排序是不穩定的,其時間平均時間複雜度是o nlgn 逆序序列下效果最差,逼近 o n2 起空間複雜度是 log2n,因為需要空間來儲存遞迴的區間範圍。templatec...
快速排序的兩種思路
選取最左端 low 為基準值,以公升序為例 從右向左 high low 查詢到乙個小於基準值的元素,再從左向右查詢乙個大於基準值的元素,再將兩者相交換。while arr j temp low從右向左 high low 查詢到乙個小於基準值的元素,將兩者相交換,再從左向右查詢乙個大於基準值的元素,再...
快速排序的兩種思路(C 實現)
includeusing namespace std int partition int array,int startindex,int endindex void quicksort int array,int startindex,int endindex 分治 雙邊迴圈法 int parti...