快速排序,当数组长度大于13时就越界了 比如100 麻烦各位看看

foollb999888 2009-07-29 07:50:09
/// <summary>
/// 快速排序
/// </summary>
class QuickSort
{
/// <summary>
/// 交换两个数字
/// </summary>
/// <param name="left"></param>
/// <param name="right"></param>
private void swap(ref int left, ref int right)
{
int temp;
temp = left;
left = right;
right = temp;
}

/// <summary>
/// 对数组进行快速排序
/// </summary>
/// <param name="list">要排序的数组</param>
/// <param name="min">数组最低位索引</param>
/// <param name="max">数组最高位索引</param>
public void Sort(int[] list, int min, int max)
{
//存储要比较的基准值
int mark;

//比较区域的左边索引
int left;

//比较区域的右边索引
int right;

//比较区域的中间索引
int middle;


if (max <= min)
{
return;
}
else if (max == min + 1)
{
if (list[min] > list[max])
{
swap(ref list[min], ref list[max]);
//int temp;
//temp = list[min];
//list[min] = list[max];
//list[max] = temp;
}

return;
}

//取得比较区域的中间索引
middle = (min + max)/2;

//取得比较的基准值
mark = list[middle];

//将第一位值交换到中间去
swap(ref list[min], ref list[middle]);


//让比较区域的左边从索引为一开始 因为索引为0处是基准值
left = min + 1;

//让比较区域的右边从最大的一位开始
right = max;

do
{
//循环比较左边的数与基准值的大小 如果左边的数比基准值小 就不变 如果遇到比基准值大的数 则记录该值的下标
while (left <= right && list[left] < mark)
{
left++;
}

//循环比较右边的数与基准值的大小 如果右边的数比基准值大 就不变 如果遇到比基准值小的数 则记录该值的下标
while (list[right] >= mark)
{
right--;

if(right==-1)
{
right = 0;
break;
}

}

//如果从左边记录值的下标比从右边记录值的下标小
if (left < right)
{
//交换两个值的位置
swap(ref list[left], ref list[right]);
//int temp;
//temp = list[left];
//list[left] = list[right];
//list[right] = temp;
}

} while (left < right);



//把
list[min] = list[right];
list[right] = mark;

//将左边区域和右边区域用递归的方法 调用本方法排序
if (min + 1 < right)
{
Sort(list, min, right - 1);
}
if (right + 1 < max)
{
Sort(list, right + 1, max);
}
}

}
...全文
105 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
llszn 2009-07-30
  • 打赏
  • 举报
回复
递归是有层数限制的。会溢出。改用循环吧!

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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