快排遞迴演算法

2023-01-11 14:55:48 字數 3133 閱讀 5899

1樓:匿名使用者

procedure qsort(i,j:longint);

var r,l:longint;mid,temp:longint;

begin

r:=j;

l:=i;

mid:=a[r];

repeat

while a[r]>mid do dec(r);

while a[l]=l

then

begin

temp:=a[r];

a[r]:=a[l];

a[l]:=temp;

inc(l);dec(r);

end;

until r

if i

if l

end;

//a是排序陣列

//基本方法:把小於min的放在一邊,

把大於min的放在另一邊. 遞迴解決.時間複雜度o(n*log(n))

2樓:出士

procedure qsort(i,j:longint);

var i,j,t,mid:longint;

begin

i:=l;j:=r;mid:=a[(l+r) div 2];

repeat

while a[i]>mid do inc(i);

while a[j]j;

if i

if l

end;

3樓:無猜想

又一個搞競賽的. 不過這是最基礎的東西, 書裡也應該有啊.

菜鳥求教簡單的快排演算法問題。

4樓:電燈劍客

你的程式邏輯有問題,但是我不想仔細看了

快速排序雖然需要遞迴,但除了調整主元的位置之外是沒有最外層的while迴圈的

給你一個樣例

void quicksort_int(int a, size_t n)

a[i] = tmp;

quicksort_int(a, i);

輸入10個數,用遞迴演算法實現快速排序

5樓:匿名使用者

#includeusing namespace std; int a[10001]; void qs(int s,int e)

6樓:匿名使用者

這個是快速排序演算法函式,輸入輸出樓主自定吧。

void qsort(int v, int left, int right)

void swap(int v, int i, int j)

7樓:

int a[10];

qsort(a, 10);

void qsort(int* arr,int n)if(arr[n] > arr[n-1])qsort(arr, n -1);}

快速排序的思想是遞迴的,但是它的平均效率卻是眾多排序演算法中最快的,為什麼

8樓:匿名使用者

任何通過把大問題分成小問題一一解決,再將其結果一一拼接起來的演算法,都是不可能實現尾遞迴的。因為解決每個小問題的時候,必須儲存得到此小問題的過程中的所有分塊資訊(呼叫幀)。你可以把所有遞迴演算法寫成迴圈演算法,但是任何無法實現尾遞迴的演算法,將其寫成迴圈之後,也必然需要一個與其遞迴版本呼叫幀堆疊結構相同的堆疊資料結構來儲存其呼叫幀資料。

為什麼快速排序不能用尾遞迴來實現

9樓:匿名使用者

遞迴過程中需要子過程計算返回結果的過程才必須要入棧。快速排序是先比較換位之後再把結果分發給兩個子過程,在執行完最後一個子過程之後程式自動結束,所以是尾遞迴的。而歸併排序需要最後一個子過程先排序,再逐級返回,繼續歸併,所以不是尾遞迴。

寫程式的時候能看出來,快速排序的遞迴呼叫都是在函式尾部,歸併排序的遞迴呼叫都在函式頭部。這才是尾遞迴和非尾遞迴的區別。

所有遞迴都可以寫成迭代,但是尾遞迴可以寫成真正的迭代,非尾遞迴依舊需要一個輔助結構來模擬或者說代替遞迴所用的棧結構。不過根據問題的不同和棧結構的實現技巧,很多非尾遞迴問題都是可以通過改寫成迭代來提高效能(節約空間或者時間)的。最明顯的例子就是斐波那契數列。

斐波那契數列遞迴過程中一定要先入棧,直到壓入f(0)和f(1)時才能開始出棧,所以不是尾遞迴的,但是通過一塊記憶體暫存上一步的結果就可以直接從f(0)和f(1)開始計算得到f(n)的值,這樣就省去了遞迴消耗的棧空間以及入棧出棧的時間開銷,所以時間和記憶體佔用都小得多。

另外雖然通常編譯器自帶的尾遞迴優化的效果我並沒有測試過。不過從網上一些人的測試來看,一般c編譯器的尾遞迴優化應該是和迭代效果相近,甚至我看到有人說測試結果中尾遞迴優化更快的。所以按理說只要編譯器帶有尾遞迴優化,寫法滿足優化要求,編譯器應該會自動完成優化的。

10樓:匿名使用者

任何通過把大問題分成小問題一一解決,再將其結果一一拼接起來的演算法,都是不可能實現尾遞迴的。因為解決每個小問題的時候,必須儲存得到此小問題的過程中的所有分塊資訊(呼叫幀)。

你可以把所有遞迴演算法寫成迴圈演算法,但是任何無法實現尾遞迴的演算法,將其寫成迴圈之後,也必然需要一個與其遞迴版本呼叫幀堆疊結構相同的堆疊資料結構來儲存其呼叫幀資料。

如何輸出快速排序演算法中每一趟的結果? 我用的是遞迴的方法

11樓:

用遞迴的話比較難輸出,因為會遞迴到最裡面,

12樓:匿名使用者

這不是一樣的嗎?

遞迴也是一樣的輸出哦。

在do{}while();之後迴圈把陣列的列印出來不就行了。

for(int mm =low; mm <=high; ++mm)printf("\n");

這樣應該就ok了

求快速排序的遞迴演算法的**,能幫忙看看怎麼做嗎

13樓:

這不就是叫你寫個快排然後統計一下遞迴次數麼..

遞迴,分治演算法,動態規劃和貪心選擇的區別

遞迴,簡單bai的重複,計算量大du。分治,zhi解決問題獨dao立,分開計算,如專其名。動態規屬划演算法通常以自底向上的方式解各子問題,貪心演算法則通常以自頂向下的方式進行 動態規劃能求出問題的最優解,貪心不能保證求出問題的最優解 貪心,遞迴,動態規劃,及分治演算法 之間的區別和聯絡是什麼?演算法...

c語言輸入整數用遞迴演算法將整數倒序輸出

include stdio h voidorder print intn if n 10 printf d n return order print n 10 printf 5d n 10 void reverse print intn if n 10 printf 5d n return prin...

有誰能告訴我,歐幾里得演算法的遞迴呼叫的

您第一張電工證複審未成功,所以有效時間截止到複審時間。如果有機會再複審,那麼有效期將會順延。我跟男朋友提了去他們家,他說這樣顯得我不值錢了什麼意思?只是開個玩笑而已,這不能說明什麼啊!只能說明你們的關係比較穩固,你的理解應該是錯了。請吧主置頂,本聯長期求下聯 上聯 請吧主置頂,本聯長期 下聯 看樓客...