2016-10-11 13 views
-4

quicksort C++を使用してリストをソートするためのプログラムです。以下のコードはcode :: blocksとhttp://cpp.sh/で正常にコンパイルされましたが、残念ながら要素を入力した後にハングします。クイックソートの実装で何が問題になっていますか?

void quicksort(vector<int> v,int left_index,int right_index) 
{ 
    if(left_index>=right_index) 
     return; 
    int pivot=(right_index+left_index)/2; 

    int left=left_index; 
    int right=right_index; 
    while(left<=right) 
    { 
     while(v[left]<v[pivot]) 
      left++; 
     while(v[right]>v[pivot]) 
      right--; 
     if(left<=right) 
     { 
      swap(v,left,right); 
      left++;right--; 
     } 
    } 
    quicksort(v,left_index,right); 
    quicksort(v,left,right_index); 
} 
+5

このような問題を解決する適切なツールは、デバッガです。スタックオーバーフローを尋ねる前に、コードを一行ずつ進める必要があります。詳しいヘルプは、[小さなプログラムをデバッグする方法(Eric Lippert)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を参照してください。最低限、問題を再現する[最小、完全、および検証可能](http://stackoverflow.com/help/mcve)の例と、その問題を再現するためのデバッガ。 –

+0

[パラメータを参照として渡す](http://www.learncpp.com/cpp-tutorial/73-passing-arguments-by-reference/)と値渡しのタイミングについて学ぶ必要があります。参照してくださいhttp://stackoverflow.com/a/3399248/104774 – stefaanv

+1

私はあなたの実装が進歩することが保証されているとは思わない:分割のいずれかが空の場合、再帰がスタックし、オーバーフロースタックまたは永遠に実行されます。 –

答えて

1
  1. 他の人が指摘しているとおり、合格が必要です。
  2. パーティション中にピボット定数を一定に保ちます。 pivot = v[pivot]はそれを保証します。
  3. 外側のループ境界は、left<=rightに変更されました。left<rightです。

実行コード。

#include <iostream> 
#include<vector> 
using namespace std; 

void print(const vector<int> &v) 
{ 
    cout<<"The sorted list is:"<<endl; 
    for(int i=0;i<(int)v.size();i++) 
     cout<<v[i]<<' '; 
    cout<<endl; 
} 
void swap(vector<int> &v,int left,int right) 
{ 
    int temp=v[left]; 
    v[left]=v[right]; 
    v[right]=temp; 
} 

void quicksort(vector<int> &v,int left_index,int right_index) 
{ 
    if(left_index>=right_index) 
     return; 
    int pivot=(right_index+left_index)/2; 

    pivot = v[pivot]; 
    int left=left_index; 
    int right=right_index; 
    while(left<right) 
    { 
     while(v[left]<=pivot) 
      left++; 
     while(v[right]>pivot) 
      right--; 
     if(left<right){ 
      swap(v,left,right); 
      left++; 
      right--; 
     } 
    } 
    quicksort(v,left_index,right); 
    quicksort(v,left,right_index); 
    print(v); 
} 

int main() 
{ 
    int no; 
    vector<int> v; 
    cout << "Please enter the elements in your list" << endl; 
    cout << "Enter 0 to exit..."<<endl; 
    while(cin >> no) 
    { 
     if(no==0) 
      break; 
     v.push_back(no); 
    } 
    quicksort(v,0,v.size()-1); 
    return 0; 
} 
+0

おかげで多くの仲間!パーティション部分のif(left Jeswin

関連する問題