for (int i = 0; i < arr.Length - 1; i++)// i ~ n-1
{
int minIndex = i;
for (int j = i + 1; j < arr.Length; j++)// i+1 ~ n 上找到最小值的下标
{
//从 i+1 的位置开始,逐个比较,得出最小值的索引
minIndex = arr[j] < arr[minIndex] ? j : minIndex;
}
//交换 i 位置 和 最小值索引位置的值
Swap(arr, i, minIndex);
}
}
public static void Swap(int[] arr, int i, int j)
{
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
复制代码
二 冒泡排序
冒泡排序的时间复杂度O(n2),额外空间复杂度O(1)
public static void BubbleSort(int[] arr)
{
if (arr == null || arr.Length < 2)
{
return;
}
for (int e = arr.Length - 1; e > 0; e--)// e 从数组长度开始,逐渐缩小 e 范围
{
for (int i = 0; i < e; i++) // i 从 0 开始遍历 到 e
{
if (arr[i] > arr[i + 1]) // 如果 i 位置的值 大于 i+1 位置的值,交换
{
Swap(arr, i, i + 1);
}
}
}
}
public static void Swap(int[] arr,int i,int j)
{
arr[i] = arr[i] ^ arr[j];
arr[j] = arr[i] ^ arr[j];
arr[i] = arr[i] ^ arr[j];
}
复制代码
三 插入排序
插入排序的时间复杂度O(n2),额外空间复杂度O(1)。最好情况下时间复杂度O(n)
public static void InsertionSort(int[] arr)
{
if (arr == null || arr.Length < 2)
{
return;
}
for (int i = 1; i < arr.Length; i++) //在 0 ~ i 范围内做到有序
{
for (int j = i - 1; j >= 0 && arr[j] > arr[j + 1]; j--)
{
Swap(arr, j, j + 1);
}
}
}
public static void Swap(int[] arr, int i, int j)
{
arr[i] = arr[i] ^ arr[j];
arr[j] = arr[i] ^ arr[j];
arr[i] = arr[i] ^ arr[j];
}
复制代码
四 异或运算 ^
4.1 关于异或运算
如果 x 计算结果为 true 且 y 计算结果为 false,或者 x 计算结果为 false 且 y 计算结果为 true,那么 x ^ y 的结果为 true。否则,结果为 false。
也就是说,对于 bool 操作数,^ 运算符的计算结果与不等运算符!= 相同。即相异为true,相同为false。