快速排序,当数组长度大于13时就越界了 比如100 麻烦各位看看
/// <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);
}
}
}