static void Swap(ref int a, ref int b)
{
if (a == b)
return;
a = (b ^= a ^= b) ^ a;
}
static void Swap(int[] arr, int i, int j)
{
if (i == j)
return;
Swap4(ref arr[i], ref arr[j]);
}
Swap是一个简单的元素值交换,这里不多介绍。
/// <summary>
/// 冒泡排序
/// </summary>
/// <param name="data"></param>
static void BubbleSort(int[] data)
{
int i, j;
for (i = 0; i < data.Length; i++)
{
for (j = 0; j < data.Length - 1; j++)
{
if (data[j] > data[j + 1])
{
Swap(data,j+1, j);
}
}
}
}
/// <summary>
/// 选择排序
/// </summary>
/// <param name="list"></param>
static void SelectionSort(int[] list)
{
int i, j, min_index;
for (i = 0; i < list.Length - 1; i++)
{
min_index = i;
for (j = i + 1; j < list.Length; j++)
{
if (list[j] < list[min_index])
{
min_index = j;
}
}
if (min_index != i)
Swap(list,min_index, i);
}
}
/// <summary>
/// 插入排序
/// </summary>
/// <param name="arr"></param>
static void InsertSort(int[] arr)
{
int i, j, key;
for (j = 1; j < arr.Length; j++)
{
key = arr[j];
i = j - 1;
while (i >= 0 && arr[i] > key)
{
arr[i + 1] = arr[i];
i--;
}
arr[i + 1] = key;
}
}
以下是快排
static Random random = new Random();
public static void quickSort(int[] arr)
{
if (arr == null || arr.Length < 2)
return;
process(arr, 0, arr.Length - 1);
}
public static void process(int[] arr, int L, int R)
{
if (L >= R) return;
// 取随机数为基准数
int temp = random.Next(L, R + 1);
// 取中间数为基准数
//int temp = L + (R - L >> 1);
// 始终以左边为基准数
//int temp = L;
Swap(arr, temp, R);
int[] equalArea = Netherlands(arr, L, R);
process(arr, L, equalArea[0] - 1);
process(arr, equalArea[1] + 1, R);
}
public static int[] Netherlands(int[] arr, int L, int R)
{
if (L > R)
return new int[] { -1, -1 };
if (L == R)
return new int[] { L, R };
int less = L - 1;
int more = R;
int index = L;
while (index < more)
{
if (arr[index] == arr[R])
index++;
else if (arr[index] < arr[R])
Swap(arr, index++, ++less);
else
Swap(arr, index, --more);
}
Swap(arr, more, R);
return new int[] { less + 1, more };
}