簡體   English   中英

為什么快速排序拋出異常“寫訪問沖突”

[英]Why quick sort throws an exception "write access violation"

我想寫快速排序,但我的程序有錯誤。 首先在我的程序中,在 qsort function 的主循環中有無限循環。然后我添加了left++; right--; left++; right--; 有一個例外。 請查看我的代碼並幫助我解決這個問題。

#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 數組中的用戶數不同。 對於應該改為:

for (int k = 0; k < n; k++)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM