2017-04-07 7 views
0

私はすぐにクイックソートを実装しようとしていました。私は0でその「現在の」ステートメントを初期化する場合でも、私はそれを実行すると、画面に何も表示されない、クイックソートの反復

for (int current = 0; current <= high - 1; current++) 

以下のループ部分でいくつかの問題を抱えています。次に、私は提供された実装のように '低い'引数に置き換えようとし、適切に実行されました。

質問したいのは、 'low'パラメータに割り当てられた値と同じ値だった0でループ文を初期化すると、なぜ機能しないのですか?私は0で新しい変数を初期化しようとし、ループにその変数を使用しますが、私は直接0ループステートメントを割り当てるときと同じ結果を与える。答えをありがとう。ここ

コード:

int partition(int arr[], int low, int high) 
{ 
    int pivot = arr[high]; 
    int index = (low - 1); 
    for (int current = low; current <= high - 1; current++) 
    { 
     if (arr[current] <= pivot) 
     { 
      index++; 
      swap(arr[index], arr[current]); 
     } 
    } 
    swap(arr[index+1], arr[high]); 
    return (index + 1); 
} 

void quicksort(int arr[], int low, int high) 
{ 
    if (low < high) 
    { 
     int pi = partition(arr, low, high); 
     quicksort(arr, low, pi - 1); 
     quicksort(arr, pi + 1, high); 
    } 
} 


int main() 
{ 
    int arr[] = { 3, 4, 2, 5, 1 }; 
    int n = sizeof(arr)/sizeof(arr[0]); 
    quicksort(arr, 0, n-1); 
    for (int i = 0; i < n; i++) 
    { 
     cout << arr[i] << " "; 
    } 
} 

The result when i set the 'current' value with 0

+0

再帰呼び出しが同じ配列を使用しますが、それの彼らの一部にのみ作動しなければなりません。 0から電流を開始すると、この部分の再帰呼び出し "agreement"に違反します。 –

答えて

1

lowのみpartitionへの最初の呼び出しで0です。他の呼び出しでは異なる値をとります。 quicksortが2回目を呼び出した場合、lowにはpi + 1が割り当てられます。

partitionの冒頭にそれを印刷して、あまりにも大きすぎない配列についてこれを観察してください。これは、一般的に良い教育練習になるはずです。私はpartitionの最初の行を作る意味:

cout << "low = " << low << "\n";