c++ - 为什么快速排序会引发异常 “write access violation”

标签 c++ algorithm sorting quicksort

我想编写快速排序,但是我的程序有错误。首先,我的程序在qsort函数的主循环中有无限循环。然后我添加了left++; right--;,但有一个异常(exception)。请查看我的代码并帮助我解决此问题。

#include <iostream>

using namespace std;

typedef int (*CFT) (const void*, const void*);

struct User
{
    const char* name;
    int dept;
};

void print_id(User* v, int sz);
int cmp2(const void* a, const void* b);
void qsort(void* base, int n, size_t sz, CFT cmp);

User heads[] = {
    "g", 1,
    "d", 3,
    "s", 5,
    "c", 2,
    "t", 4,
    "h", 6,
    "y", 7,
    "z", 8,
};

int main() {
    const int SIZE = 8;
    print_id(heads, SIZE);
    qsort(heads, SIZE, sizeof(User), cmp2);
    cout << endl << endl;
    print_id(heads, SIZE);
    return 0;
}

void print_id(User* v, int sz) {
    for (int i = 0; i < sz; i++)
    {
        cout << v[i].name << "  " << v[i].dept << endl;
    }
}

int cmp2(const void* a, const void* b) {
    int aa = ((User*)a)->dept;
    int bb = ((User*)b)->dept;
    return aa > bb;
}

void qsort(void* base, int n, size_t sz, CFT cmp) {
    char* b = static_cast<char*> (base);
    char* lg = b;
    char* rg = b + n * sz;
    char* left = lg;
    char* right = rg;
    char* control = b + (n / 2) * sz;
    do
    {
        while (cmp(control, left) && left < rg) left += sz;
        while (cmp(right, control) && right > lg) right -= sz;
        if (left <= right) {
            for (int k = 0; k < sz; k++) {
                char tmp = left[k];
                left[k] = right[k];
                right[k] = tmp; // exception write access violation
            }
            left++;
            right--;
        }
    } while (left <= right);
    if (lg < right) qsort(lg, right - lg, sz, cmp);
    if (left < rg) qsort(left, rg - left, sz, cmp);
}
我现在不知道模板如何工作,所以请不要在答案中使用它们。

最佳答案

qsort(heads, SIZE, sizeof(User), cmp2);
...
for (int k = 0; k < sz; k++)
sz是从sizeof(User)设置的
sizeof(User)与heads数组中的User数量不同。
对于应更改为:
for (int k = 0; k < n; k++)

关于c++ - 为什么快速排序会引发异常 “write access violation”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63506842/

相关文章:

c++ - 带有 C++ 的 iPhone 上的 OpenGL ES?

c# - “素数求和”花费的时间太长

Python - 列表中的列表字符串与排序反转

ruby - Ruby 中的快速排序不稳定是什么意思(并暗示)?

java - 在java中提升数字的字符串输入

c++ - 本地对象是否保证比临时参数长寿? (C++11)

c++ - 需要一种在 C++ 中设置所有接口(interface)上的 DNS 服务器的方法

c++ - 指向抽象类的指针

查找公共(public)子集的算法

python - 使用递归按字典顺序生成排列