如何解决为什么快速排序会引发异常“写访问冲突”
我想编写快速排序,但是我的程序出错。首先,我的程序在qsort函数的主循环中有无限循环。然后我添加了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,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,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++)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。