这个错误怎么解决 0xC0000005: Access Violation

crasy1984 2005-06-14 06:50:31
以下是一个快速排序的算法实现,编译能通过,但老运行是出现这个错误机制unhandle exception in quickSort.exe :0xC0000005: Access Violation.不知道是为什么?请大家指导一下,谢谢!
下面是代码:

#include <iostream>
#include <vector>

using namespace std;

//对midNumber的实现
int midNumber(vector<int>& vec,int first ,int last)
{
int midIndex, scanF,scanL;
int pivot, temp;
//如果vector中没有元素
if (first == last)
{
return last;
}
else if(first == last-1) //如果vector中只有一个元素
{
return first;
}

midIndex = (first +last)/2;
pivot = vec[midIndex];

scanF = first;
scanL = last - 1;

//对两个子表中的元素进行分类,小于等于pivot的在左子表,
//大于pivot的在右子表
for(; ; )
{
//遍历左子表找到大于pivot的值停止
while(vec[scanF] <= pivot && scanF < midIndex)
{
scanF++;
}

//遍历右子表
while(vec[scanL] > pivot && scanL > midIndex)
{
scanL--;
}

//没有找到这样的值使
//小于等于pivot的值在左子表,
//大于pivot的值在右子表
if(scanF >= midIndex && scanL >= midIndex)
{
break;
}

//此时,vec[scanF]和vec[scanL]所在错误的子表中,应交换
temp = vec[scanF];
vec[scanF] = vec[scanL];
vec[scanL] = temp;

scanF++;
scanL--;

}//结束for循环

return midIndex;
}

//对quickSort的实现
void quickSort(vector<int>& vec,int first,int last)
{
int midIndex;
int temp;

//当vector中至多有一个元素时
if (last - first <= 1)
{
return;
}
else if (last -first == 2)
{
if(vec[first] > vec[last-1])
{
temp = vec[first];
vec[first] = vec[last-1];
vec[last-1] = temp;
}
return;
}

//
midIndex = midNumber(vec,first,last);

//递归,左子表
quickSort(vec,first,midIndex-1);

//递归,右子表
quickSort(vec,midIndex+1,last);
return;
}

int main()
{
vector<int> v;
for(int i=0; i<5; i++)
{
int ci ;
cin >> ci;
v.push_back(ci);
}
quickSort(v,1,5);
for(i=0; i<v.size(); i++)
{
cout<<v[i]<<endl;
}
return 0;

}
...全文
1404 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
柯本 2005-06-14
  • 打赏
  • 举报
回复
如果不是特别想研究,C/C++本身就有sort及qsort函数:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
int randomInteger (unsigned int n) { return rand() % n; }

int randomValue () { return randomInteger(100); }

int sort_function( const void *a, const void *b)
{
return (*(vector<int>::iterator)a-*(vector<int>::iterator)b );
}
main()
{
vector<int> aVec(15);
vector<int>::iterator i;

generate(aVec.begin(), aVec.end(), randomValue);
for(i=aVec.begin();i<aVec.end();i++)
cout << *i << endl;
cout << "==============================================" << endl;
//sort (aVec.begin(), aVec.end());
qsort((void *)aVec.begin(), 15, sizeof(aVec[0]), sort_function);

for(i=aVec.begin();i<aVec.end();i++)
cout << *i <<endl;

}
gooyan 2005-06-14
  • 打赏
  • 举报
回复
设置断点,单步调式跟踪一下看看
qrlvls 2005-06-14
  • 打赏
  • 举报
回复
看看是否存在越界的地方
qrlvls 2005-06-14
  • 打赏
  • 举报
回复
检查一下哪个地方指针的使用非法

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧