去除尾遞迴的快速排序以及快速排序的棧深度

2021-08-06 05:19:32 字數 1192 閱讀 1920

對於棧深度的定義:

編譯器通常使用棧來儲存遞迴執行過程中的相關資訊,包括每次遞迴呼叫的引數等。最新呼叫的資訊存在棧的頂部,而第一次呼叫的資訊存在棧的底部。當乙個過程被呼叫時,其相關資訊被壓如棧中,當它結束時,其資訊被彈出。棧深度是在一次計算中會用到的棧空間的最大值。

對於快速排序,假設陣列引數的傳遞是用指標來指示的,所以每次過程呼叫只需要o(1)的棧空間。

去除尾遞迴的快速排序偽**如下:

tail-recursive

-quicksort(a, p, r)

while p < r

q = partition(a, p, r)

tail-recursive

-quicksort(a, p, q-

1) p = q +

1

對於該種偽**實現的去除尾遞迴的快速排序過程,其棧深度最壞情況下仍然為θ(

n)。當每次劃分返回值為r時,該演算法到達最壞情況。(partition取a[r]為主元)

修改該演算法,使其先比較劃分的兩個區間,再對小的區間進行遞迴,則可使其最壞情況下的棧深度為θ(

lgn) 。對於該種演算法,每次遞迴過程中,陣列的長度最少減一半,因此θ(

lgn) 為最壞情況下的棧深度。演算法偽**如下:

tail-recursive-quicksort'(a, p, r)

while p < r

q = partition(a, p, r)

if (q - p < r - q)

tail-recursive-quicksort'(a, p, q)

p = q + 1

else

tail-recursive-quicksort'(a, q + 1, r)

r = q - 1

該演算法的c語言版本實現如下:

void tail_recursive_quick_sort(int *source, int head, int tail) 

}void tail_recursive_quick_sort_optimized_for_stack_depth(int *source, int head, int tail) else

}}

其中randomized_partition的**見,快速排序的c語言實現。

快速排序(快排 遞迴實現)

時間複雜度 o nlogn 注意 1 時間複雜度與pivot的選取有關,最好能選到正中間 2 該排序不是穩定排序 1.0 不用swap函式 相較2.0節省時間 int qsort int l,int r s l pivot return l 2.0 用swap函式int qsort int l,in...

遞迴 快速排序 快速排序

問題描述 用遞迴來實現快速排序 quick sort 演算法。快速排序演算法的基本思路是 假設要對乙個陣列a進行排序,且a 0 x。首先對陣列中的元素進行調整,使x放在正確的位置上。同時,所有比x小的數都位於它的左邊,所有比x大的數都位於它的右邊。然後對於左 右兩段區域,遞迴地呼叫快速排序演算法來進...

排 快速排序

思路 分為交換和遞迴。交換 從右往左 如果值 當前值,則跳過 從左往右 如果值 當前值,則跳過 基準數 int temp arr left 遞迴 方法 quicksort arr,left,i 1 quicksort arr,i 1,right 遞迴出口 if left right public s...