目录
堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是 通过堆来进行选择数据。
需要注意的是排升序要建大堆,排降序建小堆。
直接选择排序的特性总结:
1. 堆排序使用堆来选数,效率就高了很多。
2. 时间复杂度:O(N * logN)
3. 空间复杂度:O(1)
4. 稳定性:不稳定
- void Swap(int* x, int* y)
- {
- int tmp = *x;
- *x = *y;
- *y = tmp;
- }
- void AdjustDown(int* a, int n, int parent)
- {
- int child = parent * 2 + 1;
- while (child < n)
- {
- if (child + 1 < n && a[child + 1] > a[child])
- {
- child++;
- }
- if (a[child] > a[parent])
- {
- Swap(&a[child], &a[parent]);
- parent = child;
- child = parent * 2 + 1;
- }
- else
- {
- break;
- }
- }
- }
-
-
- void HeapSort(int* a, int n)
- {
- //向下调整建堆
- //O(N)
- for (int i = (n - 1 - 1) / 2; i >= 0; i--)
- {
- AdjustDown(a, n, i);
- }
-
- //堆排序
- //O(N*logN)
- int end = n - 1;
- while (end > 0)
- {
- Swap(&a[0], &a[end]);
- AdjustDown(a, end, 0);
- end--;
- }
- }
-
- int main()
- {
- int arr[] = { 2, 3, 5, 7, 4, 6, 8};
- //InsertSort(arr, sizeof(arr) / sizeof(int));//排升序
- //InsertSort(arr, sizeof(arr) / sizeof(int));//排升序
- HeapSort(arr, sizeof(arr) / sizeof(int));//排升序
- for (int i = 0; i < sizeof(arr) / sizeof(int); i++)
- {
- printf("%d ", arr[i]);
- }
- }


我们可以算算向下建堆的时间复杂度

直接选择排序的特性总结:
1. 直接选择排序思考非常好理解,但是效率不是很好。实际中很少使用
2. 时间复杂度:O(N^2)
3. 空间复杂度:O(1)
4. 稳定性:不稳定
- void SelectSort(int* a, int n)
- {
- int begin = 0, end = n - 1;
- while (begin < end)
- {
- int mini = begin;
- int maxi = begin;
- for (int i = begin + 1; i <= end; i++)
- {
- if (a[i] < a[mini])
- {
- mini = i;
- }
-
- if (a[i] > a[maxi])
- {
- maxi = i;
- }
- }
-
- Swap(&a[mini], &a[begin]);
- //检查maxi是否被换走了
- if (maxi == begin)
- {
- maxi = mini;
- }
- Swap(&a[maxi], &a[end]);
- begin++;
- end--;
- }
- }
本节的重点是堆排序, 对二叉树的顺序结构基础要求很高, 大家如果基础不好或者不太理解,可以看看我二叉树的博客.
继续加油!