[英]C++ Quicksort array of string pointers
我不确定出什么问题,但是排序不正确。
这是实现:
int quickSort(std::string **arr, int left, int right)
{
static int swaps;
int i = left, j = right;
std::string *tmp;
std::string pivot = *arr[(left + right) / 2]; //middle element
//partition
while( i <= j ) {
while ((*arr[i]).compare(pivot) < 0) {
i++;
}
while ((*arr[j]).compare(pivot) < 0) {
j--;
}
if ( i <= j ) {
swaps++;
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
i++;
j--;
}
}
//recursion
if ( left < j ) {
quickSort(arr, left, j);
}
if ( i < right ) {
quickSort(arr, i, right);
}
return swaps;
}
arr
是字符串指针的数组。 每个索引都指向一个字符串,在这种情况下,这些字符串都是全名。 该方法肯定是进行交换,我只是完全不知道它在做什么。
例如,给定这些初始值:
Pointer Value
0055B5D8 - JAMES
0055B3F8 - JOHN
0055C808 - ROBERT
0055C8A8 - MICHAEL
0055CB88 - WILLIAM
0055CC28 - DAVID
0055CCC8 - RICHARD
0055CD68 - CHARLES
0055CE08 - JOSEPH
0055CEA8 - THOMAS
我的quickSort
方法始终将它们移动到以下顺序:
Pointer Value
0055C8A8 - MICHAEL
0055B5D8 - JAMES
0055C808 - ROBERT
0055B3F8 - JOHN
0055CB88 - WILLIAM
0055CEA8 - THOMAS
0055CE08 - JOSEPH
0055CD68 - CHARLES
0055CCC8 - RICHARD
0055CC28 - DAVID
假定我要立即将所有这些分配给另一个对象以构建初始数组,则“未排序”列表的指针按升序排列。 但是“排序”列表似乎根本没有排序。
为了清楚起见,目标是按字母顺序排列名称列表。
您在枢轴的两侧都使用相同的比较。 这意味着您允许较小的值保留在右侧。 您需要进行如下修改:
while ((*arr[i]).compare(pivot) < 0) {
i++;
}
while ((*arr[j]).compare(pivot) > 0) { // <----
j--;
}
这是一个经典的复制粘贴错误。 复制一段代码时要小心,而不要从头开始编写。 您的大脑很容易被欺骗,以为您改变了所有重要部分。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.