2012-04-16 81 views
1

我正在做我的功课,并完成了quicksort递归,但它没有以正确的方式排序。似乎它不能正确交换。C++ quicksort排序字符串文本

这里是我的代码

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


int quick_sort_help(string &text,int left, int right, int pivot){ 


    char val = text[pivot]; 
    char temp; 

    //swap 
// temp =text[pivot]; 
    //text[pivot]= text[right]; 
    //text[right]=temp; 

    //swap(&text[left],&text[right]); 

    int l = left; 
    int r = right; 

    int i=left; 
    while (i<=r) 
    { 
     while (text[i]<val) 
      i++; 
     while (text[right]>val) 
      r--; 
     if (i<=r) 
     { 
      temp=text[i]; 
      text[i]=text[r]; 
      text[r]=temp; 
      i++; 
      r--; 
     } 
    } 


    return l; 
    } 


void quicksort(string &text,int left, int right){ 

     if (left < right){ 

      int pivot=(left+right)/2; 
      int pivottwo = quick_sort_help(text, left, right, pivot); 
      quicksort(text, left, pivottwo - 1); 
      quicksort(text, pivottwo + 1, right); 
      } 
} 
void quick_sort(string &text,int size){ 
       quicksort(text,0,size);} 


int main() 
{ 

    string text="this is a test string text,.,!"; 
    int size = text.length(); 
    float t1, t2; 
    t1 = clock(); 
    quick_sort(text,size); 

    t2=clock(); 
    cout<<"quicksort Sort: "<<(t2-t1)/CLK_TCK*1000<<" msec\n"; 
    cout<<text<<endl; 


    system("pause"); 
    return 0; 
} 

输出我得到:

hi a e e,g.nii,r!tssssxttttt 
+1

你是否尝试通过调试器运行它?这可以帮助很多。您可以使用的另一个好技术是首先单独测试分区函数('quick_sort_help'),看它是否正确。 – 2012-04-16 19:24:16

+0

是的,我正在尝试调试 – mydreamadsl 2012-04-16 19:27:26

回答

3

你必须:

1)不要使用大小,但大小1值

void quick_sort(string &text,int size){ 
      quicksort(text,0,size-1);} 

2)Pivot是不是(左+右)/ 2,但它是由quick_sort_help返回的值和pivottwo是没有必要的:

void quicksort(string &text,int left, int right) 
{ 
    if (left < right) 
    { 
     int pivot = quick_sort_help(text, left, right); 
     quicksort(text, left, pivot - 1); 
     quicksort(text, pivot + 1, right); 
    } 
} 

3)返回枢轴(I值)之前在第二,而测试我Ĵ值(您R),使交流:

int quick_sort_help(string &text,int left, int right) 
{ 
    char val = text[right]; 
    char temp; 

    int j = right; 
    int i = left - 1; 

    while (true) 
    { 
    while (text[++i] < val); 

    while (text[--j] > val) { 
     if(j == left) 
      break; 
    } 

    if(i >= j) 
     break; 

    temp=text[i]; 
    text[i]=text[j]; 
    text[j]=temp; 
} 

temp=text[i]; 
text[i]=text[right]; 
text[right]=temp; 

return i; 
} 
+0

谢谢,但是ID不会对我的字符排序 – mydreamadsl 2012-04-16 20:03:26

+0

为什么不呢?我的文本排序包含:!,,。aeeghiiinrssssttttttx。它工作... – gliderkite 2012-04-16 20:05:17

+1

对不起,你是对的,它没有重建。非常感谢您的明确解释和代码支持 – mydreamadsl 2012-04-16 20:11:12

0

在此请看:Quicksort implementation

+4

如果他做功课,只是给出一个解决方案不是帮助的方式。 – Dani 2012-04-16 19:23:12

+0

由于他非常接近解决方案,所以我会帮助他简单地寻找解决方案以解决他的问题,并看看不同类型的实现。这也是学习的好方法。 – Erwald 2012-04-16 19:38:41

0
while (text[right]>val) 
     r--; 

似乎也不太可能。你递减r,但你测试的条件不会改变(应取决于r,大概...)

而且

return l; 

看起来很可疑,因为调用函数似乎期望它成为枢轴的新位置,而它是旧的左边。

另一个,你使用闭区间(see why you shouldn't),这意味着你正在访问字符串越界(这是UB)。

+0

我正在比较枢轴,对吧?所以val是我的支点,如果right> pivot,我dec的权利? – mydreamadsl 2012-04-16 19:32:39

+0

@mydreamadsl:也许(你在帖子中用过三次“right”,我不太清楚你的意思)。无论如何,考虑发布的代码的作用,你认为它应该做什么,以及我在括号中写的是什么。顺便说一句你的代码在ideone上做了一些不同的事情:http://ideone.com/CMqJw – jpalecek 2012-04-16 19:52:46