Pythonクイックソートの実装を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;
}