Swap交换函数
private static void Swap(ref T t1, ref T t2) {
T tmp = t1;
t1 = t2;
t2 = tmp;
}
选择排序
#region 选择排序算法
public static void SelectSort(T[] arr) {
for (int i = 0; i < arr.Length - 1; i++) {
int minIndex = i;
for (int j = i + 1; j < arr.Length; j++)
if (arr[j].CompareTo(arr[minIndex]) < 0)
minIndex = j;
Swap(ref arr[i], ref arr[minIndex]);
}
}
#endregion
冒泡排序
#region 冒泡排序算法
public static void BubbleSort(T[] arr) {
for (int i = 1; i < arr.Length; i++) {
for (int j = 0; j < arr.Length - i; j++) {
if (arr[j].CompareTo(arr[j + 1]) > 0)
Swap(ref arr[j], ref arr[j + 1]);
}
}
}
#endregion
插入排序
#region 插入排序算法
public static void InsertSort(T[] arr) {
T tmp;
int i, j;
for (i = 1; i < arr.Length; i++) {
tmp = arr[i];
for (j = i; j >= 1 && tmp.CompareTo(arr[j - 1]) < 0; j--)
arr[j] = arr[j - 1];
arr[j] = tmp;
}
}
#endregion
快速排序
#region 快速排序算法
public static void QuickSort(T[] arr) {
QuickSort(arr, 0, arr.Length - 1);
}
private static void Median3(T[] arr, int left, int right) {
int center = (left + right) / 2;
if (arr[left].CompareTo(arr[center]) > 0) Swap(ref arr[left], ref arr[center]);
if (arr[center].CompareTo(arr[right]) > 0) Swap(ref arr[center], ref arr[right]);
if (arr[left].CompareTo(arr[center]) > 0) Swap(ref arr[left], ref arr[center]);
Swap(ref arr[center], ref arr[right]);
}
private static void QuickSort(T[] arr, int left, int right) {
if (left >= right) return;
if (right - left >= 3) Median3(arr, left, right);
int l = left - 1, h = right;
while (true) {
while (arr[++l].CompareTo(arr[right]) < 0) ;
while (h > left && arr[--h].CompareTo(arr[right]) > 0) ;
if (l >= h) break;
Swap(ref arr[l], ref arr[h]);
}
Swap(ref arr[l], ref arr[right]);
QuickSort(arr, left, l - 1);
QuickSort(arr, l + 1, right);
}
#endregion
归并排序
#region 归并排序算法
public static void MergeSort(T[] arr) {
T[] t = new T[arr.Length];
MergeSort(arr, t, 0, arr.Length - 1);
}
private static void MergeSort(T[] arr, T[] t, int ll, int rr) {
if (ll >= rr) return;
int mid = (ll + rr) >> 1;
MergeSort(arr, t, ll, mid);
MergeSort(arr, t, mid + 1, rr);
int p = ll, q = mid + 1;
for (int i = ll; i <= rr; i++)
if (q > rr || (p <= mid && arr[p].CompareTo(arr[q]) < 0))
t[i] = arr[p++];
else
t[i] = arr[q++];
for (int i = ll; i <= rr; i++) arr[i] = t[i];
}
#endregion
希尔排序
#region 希尔排序算法
public static void ShellSort(T[] arr) {
List<int> sedArr = GetSedgewick(arr.Length);
T tmp;
int Si = 0, D, i, j;
for (D = sedArr[Si]; D > 0; D = sedArr[++Si]) {
for (i = D; i < arr.Length; i++) {
tmp = arr[i];
for (j = i; j >= D && tmp.CompareTo(arr[j - D]) < 0; j -= D)
arr[j] = arr[j - D];
arr[j] = tmp;
}
}
}
private static List<int> GetSedgewick(int len) {
List<int> sed = new List<int>();
sed.Add(0);
for (int i = 0; ; i++) {
long tmp = 9 * ((1 << 2 * i) - (1 << i)) + 1;
if (tmp <= len)
sed.Insert(0, (int)tmp);
tmp = (1 << (2 * i + 4)) - 3 * (1 << i + 2) + 1;
if (tmp <= len)
sed.Insert(0, (int)tmp);
else
break;
}
return sed;
}
#endregion
堆排序
#region 堆排序算法
public static void HeapSort(T[] arr) {
for (int i = arr.Length / 2 - 1; i >= 0; i--)
PercDown(arr, i, arr.Length);
for (int i = arr.Length - 1; i > 0; i--) {
Swap(ref arr[0], ref arr[i]);
PercDown(arr, 0, i);
}
}
private static void PercDown(T[] arr, int P, int N) {
int parent, child;
T X = arr[P];
for (parent = P; (parent * 2 + 1) < N; parent = child) {
child = parent * 2 + 1;
if ((child != N - 1) && (arr[child].CompareTo(arr[child + 1]) < 0))
child++;
if (X.CompareTo(arr[child]) >= 0) break;
else
arr[parent] = arr[child];
}
arr[parent] = X;
}
#endregion
基数排序
void RadixSort(vector<int>& nums) {
int n = nums.size();
int maxVal = INT_MIN;
for (int i = 0; i < n; ++i) maxVal = max(maxVal, nums[i]);
int exp = 1;
vector<int> buf(n);
while (maxVal >= exp) {
vector<int> cnt(10);
for (int i = 0; i < n; ++i) {
int digit = (nums[i] / exp) % 10;
cnt[digit]++;
}
for (int i = 1; i < 10; i++) cnt[i] += cnt[i - 1];
for (int i = n - 1; i >= 0; --i) {
int digit = (nums[i] / exp) % 10;
buf[cnt[digit] - 1] = nums[i];
cnt[digit]--;
}
copy(buf.begin(), buf.end(), nums.begin());
exp *= 10;
}
}