快速排序C ++实现(使用随机数据透视)中断并陷入无限循环

时间:2013-03-21 14:40:16

标签: c++ python xcode sorting quicksort

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

请帮我找到错误并指出我在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;
}

2 个答案:

答案 0 :(得分:4)

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

lesser[j] = lst[i];

正在访问超出范围的索引。

答案 1 :(得分:2)

您至少有一个主要问题,即您没有宣布lessergreater有任何规模:

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

所以稍后当你试图访问它们时,你将超出界限:

lesser[j] = lst[i];

然后稍后当它取大小时0

int len_lesser = sizeof(lesser)/sizeof(int);

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

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

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