排序思路:循环取出最大值放在数组的最后,最小值放到最前。
上代码:
void bubbleSort5(int[] arr)
{
//设置数组左右边界
int left = 0, right = arr.Length;
int min ,max;
int x1 = 0, x2 = 0;
int t1 = 0, t2 = 0;
//当左右边界未重合时,继续排序
while (left < right)
{
min = int.MaxValue;
max = int.MinValue;
for (int i = left; i < right; i++)
{
//选出最大的数放到数组右边
if (arr[i] > max)
{
max = arr[i];
x1 = i;
}
//选出最大的数放到数组左边
if (arr[i] < min)
{
min = arr[i];
x2 = i;
}
}
if (x1 == right - 1 && x2 == left)
{
right--;
left++;
continue;
}
t1 = arr[right-1];//缓存右边界值
t2 = arr[left];//缓存左边界值
arr[right - 1] = max;//存放最大值
arr[left] = min;//存放最小值
//同时交换时防止边界值覆盖最大值和最小值
//最大值不在左边界,且最小值不在右边界
if (x2 != right - 1 && x1 != left)
{
arr[x2] = t2;
arr[x1] = t1;
}
//最大值在左边界,且最小值不在右边界,仅交换右边界的值
if (x1 == left && x2 != right - 1) arr[x2] = t1;
//最大值不在左边界,且最小值在右边界,仅交换左边界的值
if (x1 != left && x2 == right - 1) arr[x1] = t2;
right--;
left++;
}
}