快速排序的兩種實現思路和非遞迴實現 C 實現

2021-07-22 17:34:20 字數 2382 閱讀 1450

思路一:

第一種是根據演算法導論上的思想:取陣列的最後乙個元素為主元,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...