今天对电路节点进行序号快排时出现了缓冲区溢出的问题,代码简化如下:
template<typename T>
//2、分组函数
int packet(T* array2, int low, int high)
{
T pv = array2[low];
cout << "此时array[low]: "<<pv <<"low: "<<low<<" high: "<< high<<endl;
while (low < high) //当high和low都移动到同一个位置时结束
{
while(array2[high] >= pv)
{
high--; //本身就大于的话就往前调一格
}
swap1(array2, low, high); //当右边值不大于pv时则交换其与array[low]的值
while(array2[low] <= pv)
{
low++;
}
swap1(array2, low, high);
}
return low;
}
报错:
由于大家都是面向百度编程,所以很简单地搜到了让我在连接器里面增大缓冲区空间,emmmmmm应该不会是这个问题吧。
在报错处添加debug语句:
cout << "此时array[low]: "<<pv <<"low: "<<low<<" high: "<< high<<endl;
结果出现:
问题找到了,这样的死循环溢出只是时间问题,分析可以发现我们虽然在主循环中添加了判断语句,但是分循环中的确实开放的,所以多次调用后,low和high的值会不遵循预设大小关系,这在快排中是不被允许的。所以在加入以下判断语句后:
template<typename T>
int packet(T* array2, int low, int high)
{
T pv = array2[low];
cout << "此时array[low]: "<<pv <<"low: "<<low<<" high: "<< high<<endl;
while (low < high)
{
while(low <high &&array2[high] >= pv) //添加1
{
high--; //本身就大于的话就往前调一格
}
swap1(array2, low, high);
while(low<high &&array2[low] <= pv)//添加判断二
{
low++;
}
swap1(array2, low, high);
}
return low;
}
结果正常
完整代码:
#include <iostream>
using namespace std;
//快速排序
/*
1、选取一个枢纽pivot(一般为分组最左边的一个值),以pivot为界让数据分成两部分,然后将两部分再递归调用排序函数。
2、递归,直到组只剩下一个元素时排序完成。
*/
template<typename T>
//1、交换数组两个位置的值
void swap1(T *array, int low, int high)
{
T temp = array[low];
array[low] = array[high];
array[high] = temp;
}
template<typename T>
//2、分组函数
int packet(T* array2, int low, int high)
{
T pv = array2[low];
cout << "此时array[low]: "<<pv <<"low: "<<low<<" high: "<< high<<endl;
while (low < high) //当high和low都移动到同一个位置时结束
{
while(low <high &&array2[high] >= pv)
{
high--; //本身就大于的话就往前调一格
}
swap1(array2, low, high); //当右边值不大于pv时则交换其与array[low]的值
while(low<high &&array2[low] <= pv)
{
low++;
}
swap1(array2, low, high);
}
return low;
}
template< typename T>
void fastsort(T *array, int low,int high)
{
if (low == high)
{
return;
}
T pv = packet<T>(array, low, high);
cout << "快速排序后:";
for (int i = 0; i <= high; i++)
{
cout << array[i];
}
cout << endl;
fastsort(array, low, pv - 1);
cout << "执行分组" << endl;
fastsort(array, pv + 1, high);
}
int main()
{
int array2[] = { 4,7,2,8,5 };
int high = sizeof(array2) / sizeof(int);
cout << high << endl;
int high2 = high - 1;
fastsort<int>(array2, 0, high2 );
cout << "快速排序后:";
for (int i = 0; i < high; i++)
{
cout << array2[i];
}
cout << endl;
}