2013-03-21 68 views
1

我正在尝试将我的Python快速排序实现转换为C++并编写了一些代码。代码似乎打破了。我使用Xcode进行开发,所有我看到,当我编译&运行的代码是(lldb),程序似乎陷入了无限循环。快速排序C++实现(使用随机数据透视表)中断并陷入无限循环

请帮我看看这个bug并指出我在C++实现中出错的地方。

Python的快速排序代码:

from random import randint 

def quickSort(lst): 
    if not lst: 
     return [] 
    else: 
     pivot_index = randint(0, len(lst) - 1) 
     pivot = lst[pivot_index] 
     lesser = quickSort([l for i, l in enumerate(lst) 
          if l <= pivot and i != pivot_index]) 
     greater = quickSort([l for l in lst if l > pivot]) 
     #print lesser, pivot, greater 
     return lesser + [pivot] + greater 

print quickSort([3, 2, 5, 6, 1, 7, 2, 4, 234, 234, 23, 1234, 24, 132]) 

C++快速排序代码:

#include <iostream> 
#include <cstdlib> 
#include <ctime> 

using namespace std; 

// simple print function 
void print(int* lesser, int len_lesser, int pivot, int* greater, int len_greater) { 
    for (int i=0; i < len_lesser-1; i++) { 
     cout << lesser[i] << " "; 
    } 
    cout << pivot << " "; 
    for (int i=0; i < len_greater-1; i++) { 
     cout << greater[i] << " "; 
    } 
    cout << endl; 
} 

unsigned long long rdtsc(){ 
    unsigned int lo,hi; 
    __asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi)); 
    return ((unsigned long long)hi << 32) | lo; 
} 

int randint(int len) { 
    // srand(time(0)); 
    srand((unsigned)rdtsc()); 
    return (rand() % (len) + 0); 
} 
void quickSort(int* lst, int len) { 
    if (lst == NULL) { 
     cout << "List Empty" << endl; 
     return; 
    } 
    else { 
     int lesser[] = {}; 
     int greater[] ={}; 
     int j = 0; 
     int k = 0; 
     int pivot_index = randint(len); 
     int pivot = lst[pivot_index]; 
     //cout << pivot << endl; 
     for (int i=0; i < len-1; i++) { 
      if (lst[i] <= pivot && i != pivot_index) { 
       lesser[j] = lst[i]; 
       j = j+1; 
      } 
     } 
     int len_lesser = sizeof(lesser)/sizeof(int); 
     quickSort(lesser, len_lesser); 

     for (int i=0; i < len-1; i++) { 
      if (lst[i] > pivot) { 
       greater[j] = lst[i]; 
       k = k+1; 
      } 
     } 
     int len_greater = sizeof(greater)/sizeof(int); 
     quickSort(greater, len_greater); 
     print(lesser, len_lesser, pivot, greater, len_greater); 
    } 

} 


int main() { 
    int lst[] = {3, 2, 5, 6, 1, 7, 2, 4, 234, 234, 23, 1234, 24, 132}; 
    int len = sizeof(lst)/sizeof(int); 
    quickSort(lst, len); 
    return 0; 
} 
+0

'int lessser [] = {};'将创建一个空列表。你怎么才能在它内部分配?你也在第二个分区增加'k',但你用'j'索引。 – 2013-03-21 14:46:41

+0

你的'randint()'函数有问题。你只需要调用'srand()'__once__(通常在'main()')中为随机数生成器播种。我也不知道你为什么要对返回值做'+ 0'。 – Blastfurnace 2013-03-21 19:38:40

回答

2

你有你不声明lesser也不greater有任何大小至少有一个主要问题:

int lesser[] = {}; 
int greater[] ={}; 

所以后来当您尝试访问他们,你会出界:

lesser[j] = lst[i]; 

int len_lesser = sizeof(lesser)/sizeof(int); 
:后来当取它的大小将是 0

,然后

干净的解决方案是使用std::vector,然后你不必担心分配或大小。您应该尝试启用警告并随时编译。在gcc-Wall -W -pedantic运行时,它不会让我来编译,它告诉我:

36:26: error: zero-size array 'lesser' 
37:26: error: zero-size array 'greater' 

它告诉你马上什么是错的。

+0

请帮我纠正错误的行。 – Shankar 2013-03-21 15:02:26

+0

更好的解决方案是使用'std :: vector',否则你将不得不担心动态分配数组以及所有随之而来的乐趣 – 2013-03-21 15:50:49

4

C++声明数组不是动态的。您将不得不使用std::vector或动态分配数据。否则,这些调用(在函数quickSort中):

lesser[j] = lst[i]; 

正在访问索引超出界限。

+0

如果您可以展示如何动态地将数据分配给具有上下文的数据到我的代码中,这将会非常有帮助。我很困惑如何在C++中声明和定义一个动态数组(Empty)。 – Shankar 2013-03-21 15:01:39

+1

@ArunprasathShankar你不能只声明它。在C++中,您必须手动管理动态数组的分配和释放。所以一种更简单的方法(在我看来更好)解决方案是使用std :: vector。 – 2013-03-21 15:03:26