2017-01-21 11 views
-2

私はC++でクイックソートを使用して、アルファベットのソートを実装しようとしているが、私はそうする:(以下 文字列のクイックソート

は私のコードであることができないんだけど:

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

int partition(string &str, int start, int end){ 
    int pivot = str[end-1]; 
    int i = start; 
    for(int j=start; j<end-1 ; j++){ 
     if(str[j]<=pivot){ 
      swap(str[j], str[i]); 
      i++; 
     } 
    } 
    swap(str[i], str[end]); 
    return i; 
} 

void quicksort(string &str, int start, int end){ 
    if(start<end){ 
     int pIndex = partition(str, start, end); 

     quicksort(str, start, pIndex-1); 
     quicksort(str, pIndex+1, end); 
    } 
} 
int main() 
{ 
    int t,k, end, start; 
    string str; 

    cin>>t; 
    for(k=0;k<t;k++){ 
     cin>>str; 
     end = str.size(); 

     quicksort(str, 0, end); 
     for(int l=0; l<end; l++){ 
      cout<<str[l]; 
     } 
     cout<< "\n"; 
    } 


    return 0; 
} 

てくださいそれを見て、私はそれが間違ってやっているところに私を助けて?:(事前に

感謝。

+0

ような何かを試すことができますので、

std::sort(str.begin(), str.end());

を使用することができますあなたのために(少し修正された)クイックソートを行います。 –

答えて

1

あなたの間違いは、あなたのクイックソートアルゴリズムでは、あなただけのiなしを持っているということです最後の境界のように、。

本当に実装しますか?あなたはただそれは、あなたがあなた自身のクイックソートを書くことにした場合、あなただけの `のstd :: sort`を使用して、この

#include <stdio.h> 
#include <string> 
#include <iostream> 

void quickSort(std::string &str, int left, int right) { 
      int i = left, j = right; 
      int mid = str[(left + right)/2]; 

      /* partition */ 
      while (i <= j) { 
       while (str[i] < mid) 
         i++; 
       while (str[j] > mid) 
         j--; 
       if (i <= j) { 
         std::swap(str[i], str[j]); 
         i++; j--; 
       } 
      }; 

      /* recursion */ 
      if (left < j) 
       quickSort(str, left, j); 
      if (i < right) 
       quickSort(str, i, right); 
    } 

int main() 
{ 
    std::string str; 
    std::cin >> str; 
    quickSort(str, 0, str.size()-1); 
    std::cout << str; 
}