简单选择排序
简单选择排序:在待排序的数据中选出最大(小)的元素放在其最终的位置。
- 时间复杂度=O(n2),空间复杂度=O(1)。稳定排序。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| internal class Program { private static void Main(string[] args) { int[] arr = { 5, 7, 3, 8, 6, 9 }; Console.WriteLine("未排序前的数组:"); for (int i = 0; i < arr.Length; i++) { Console.Write(arr[i] + " "); } Console.WriteLine(); selection_sort(arr); Console.WriteLine("排序后的数组:"); for (int i = 0; i < arr.Length; i++) { Console.Write(arr[i] + " "); } }
private static void selection_sort(int[] arr) { int length = arr.Length; int i, j, min; for (i = 0; i < length - 1; i++) { min = i; for (j = i + 1; j < length; j++) { if (arr[j] < arr[min]) { min = j; } } if (min != i) { int temp = arr[i]; arr[i] = arr[min]; arr[min] = temp; } } } }
|
输出:
未排序前的数组:
5 7 3 8 6 9
排序后的数组:
3 5 6 7 8 9
堆排序
堆排序:堆的是指就是满足二叉树中任一非叶子结点均小于(大于)它的孩子结点的完全二叉树。
- 时间复杂度=O(nlog2n),空间复杂度=O(1)。不稳定排序。
- 小根堆:若n个元素的序列{a1a2…an}满足ai ≤ a2i和ai ≤ a2i+1。
- 大根堆:若n个元素的序列{a1a2…an}满足ai ≥ a2i和ai ≥ a2i+1。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
| internal class Program { private static void Main(string[] args) { int[] arr = { 5, 7, 3, 8, 6, 9 }; Console.WriteLine("未排序前的数组:"); for (int i = 0; i < arr.Length; i++) { Console.Write(arr[i] + " "); } Console.WriteLine(); small_heap_sort(arr); Console.WriteLine("排序后的数组:"); for (int i = 0; i < arr.Length; i++) { Console.Write(arr[i] + " "); } }
private static void big_heap_sort(int[] arr) { for (int i = arr.Length / 2 - 1; i >= 0; i--) { big_heap_adjust(arr, i, arr.Length); } for (int i = arr.Length - 1; i > 0; i--) { int temp = arr[0]; arr[0] = arr[i]; arr[i] = temp; big_heap_adjust(arr, 0, i); } }
private static void big_heap_adjust(int[] arr, int parent, int length) { int temp = arr[parent]; int child = parent * 2 + 1; while (child < length) { if (child + 1 < length && arr[child + 1] > arr[child]) { child++; } if (temp > arr[child]) { break; } arr[parent] = arr[child]; parent = child; child = parent * 2 + 1; } arr[parent] = temp; }
private static void small_heap_sort(int[] arr) { for (int i = arr.Length / 2 - 1; i >= 0; i--) { small_heap_sort(arr, i, arr.Length); } for (int i = arr.Length - 1; i >= 0; i--) { int temp = arr[0]; arr[0] = arr[i]; arr[i] = temp; small_heap_sort(arr, 0, i); } }
private static void small_heap_sort(int[] arr, int parent, int length) { int temp = arr[parent]; int child = parent * 2 + 1; while (child < length) { if (child + 1 < length && arr[child + 1] < arr[child]) { child++; } if (temp < arr[child]) { break; } arr[parent] = arr[child]; parent = child; child = parent * 2 + 1; } arr[parent] = temp; } }
|