繁体   English   中英

索引数组快速排序调试

[英]Indexed array quicksort debug

我对这种特殊的快速排序算法很不满意,我不知道问题出在哪里。 我在一个论坛上找到了一个例子,很好地解释了我要做什么。

给定一个连续的,有序的数字的索引数组(表示数据数组中的元素),您仍然必须比较数据值。 您只需通过索引访问它们。 您交换索引值,但是不交换数据值。

Unsorted data: 09 04 47 05 03 12
Index array:   00 01 02 03 04 05

After sort,
Unsorted data: 09 04 47 05 03 12
Index array:   04 01 03 00 05 02

Print the values indexed by the index array,
from beginning to end of the array:

Index array [0] value [04] data array [04] = 03
            [1]        01             [01]   04
            [2]        03             [03]   05
            [3]        00             [00]   09
            [4]        05             [05]   12
            [5]        02             [02]   47

Output is the data, ordered at the output

我只添加一件事。 比较器是普通的比较器,不同之处在于,如果我们要比较两个具有相同值的不同字符,则比较每个字符的下一个字符并返回结果。 即,比较旋转。

int compare(unsigned char i, unsigned char j);

我不会发布该定义,因为我确信它可以完美工作。 错误在于quicksort定义。

void quicksort(unsigned char* a, unsigned char left, unsigned char right) {
    unsigned char i = left;
    unsigned char j = right;
    unsigned char half = (left + right) / 2;
    while (i <= j) {
        while ((compare(a[i], a[half]) == -1) && (i < right))
            i++;
        while ((compare(a[j], a[half]) == 1) && (j > left))
            j--;

        if (i <= j) {
            unsigned char aux = a[i];
            a[i] = a[j];
            a[j] = aux;
            i++;       //THERE
            j--;       //THERE
        }

    }

    if (left < j)
        quicksort(a, left, j);
    if (i < right)
        quicksort(a, i, right);

}

有时i = 255和j = 0,但我不为什么,程序到达那里,并且它们的值溢出。 我已经寻找了上千次错误,但是我找不到错误在哪里。
注意:1)我完全了解C ++无符号字符范围,并且无法将它们更改为int。 2)我实际上并不包括实际数据数组的声明。 比较函数可以访问它,因为它是其类的一个属性。

不能在无符号字符中存储大于255或小于0的数字。 一个无符号字符可以存储一个无符号字节定义的范围,因此可以存储8个二进制数字。 2 ^ 8 = 256,由于我们包括0,所以我们有256-1,即为255。(或十六进制为0xFF)

尝试使用整数,甚至短裤。 (关键字short

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM