簡體   English   中英

用C編程的快速排序

[英]Quick sort programmed in C

我正在閱讀K&R的ANSIC。 我遇到了qsort程序。 我需要一點幫助。 假設我有9個索引為0-> 8的元素。 請閱讀評論,看看我是否理解正確與否。 非常感謝您的努力

void qsort(int v[] , int left, int right)
{
int i, j, last;
void swap(int v[], int i, int j);   

if(left >= right)               /*if the array has only one element return it*/
      return;
swap(v,left, (left+right)/2); /* now, left=(left+right)/2= 0+8/2= 4 we have 4 as left*/
last= left;   /* putting left = last of the first partition group i.e. last=4*/

for(i=left+1; i<=right,i++)  /* now looping from 4+1=5 to 8 with increment of 1*/
     if(v[i] < v[left])       /*if value at 5th is less than value at 4th */
          swap(v, ++last, i);  

我在最后的交換步驟中遇到問題。 正如我的價值觀所示,將++ 4換為i即4 + 1 = 5(用5交換5位)。 我該怎么理解? 必須在4和5之間進行交換,不是5和5?

代碼繼續

swap(v,left, last);
qsort(v,left,last-1);
qsort(v,last+1,right);
}

首先,您對交換功能有一個小的誤解。 假設該函數的原型是-

swap(int array[], int i, int j)

swap函數在位置array [i]和array [j]處交換數字。 因此,swap函數交換數組中的元素。 所以,線-

swap(v, left, (left + right) / 2);

表示數組中的中間元素與最左邊的元素交換。 顯然,快速排序將中間元素作為關鍵。 此交換對局部變量或參數沒有影響。 根據您的數據輸入示例,即使交換后,“ left”的值也等於0,right的值等於“ 8”。 這是您感到困惑的地方。 數組的元素被交換,而不是變量的值。 所以,現在,這條線-

last = left;

使得'last'指向樞軸的位置('left'),所以這里'last'的值= 0而不是4。因此,循環

for(i = left + 1; i <= right; i++) 

從i = 1到8。順便說一句,您忘記了分號..! 然后,線,

if(v[i] < v[left])

檢查當前元素('v [i]')是否小於樞軸('v [left]')。 然后,相應地交換行中的較小元素,

 swap(v, ++last, i);

從位置(最后+1)到它增加到的位置。 因此,“最后一個”左側的元素小於樞軸,而右側的元素則更大。 我認為您遺漏了另一行,在執行算法的過程中,我們將樞軸移回到了中間位置[v [left]'。 然后,遞歸調用發揮作用。 如果您正在尋求Quicksort的幫助, 是一個不錯的起點!

希望我的回答對您有所幫助,如果有,請告訴我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM