public static void Sort(ref int[] numbers)
{
int lastSwapIdx = numbers.Length;
for(int i = 0; i < numbers.Length; i++)
{
int curLastSwapIdx = numbers.Length - 1 - i; // 当前轮次最后一次交换的位置,这个位置之后的位置都是排好序的
for (int k = 0; k< lastSwapIdx && k < numbers.Length - 1 - i; k++)
{
if (numbers[k] > numbers[k + 1])
{
Swap(ref numbers[k], ref numbers[k + 1]);
curLastSwapIdx = k;
}
}
lastSwapIdx = curLastSwapIdx;
}
}
public static void Swap(ref int a, ref int b)
{
var temp = a;
a = b;
b= temp;
}
冒泡排序优化,curLastSwapIdx 记录每个轮次最后一次交换的位置;最后一次交换说明之后的数组就是有序的了。
下次排序的时候只要排到 curLastSwapIdx 处就可以了。
例如数组 3,2,1,5,6,7
第一次交换完成后 2,1,3,5,6,7;此时 curLastSwapIdx = 2;
下一轮只要交换 2,1 就完成了;
还可以加上唐老师的方法,判断是否没有交换了