简单选择排序
选择排序是一种简单直观的排序算法。首先在未排序序列中找到最大(最小)的元素,存放到排序学列的其实位置,然后在剩余的未排序的元素中寻找最小(最大)元素,存放在已排序序列的后面。
算法步骤
- 在未排序序列中找到最大(小)元素,存放在排序序列的起始位置
- 再从剩余的未排序序列中找到最大(小)元素,然后存放在已排序序列的后面
- 重复上诉第二步骤,直至排序结束
代码实现
void selection_sort(int arr[], int len) {
for (int i = 1; i <= len; i++) {
int maxn = i;
for (int j = i + 1; j <= len; j++) {
if (arr[j] > arr[maxn]) maxn = j;
}
swap(arr[i], arr[maxn]);
}
}
堆排序
堆排序 ( H e a p s o r t ) (Heapsort) (Heapsort)是指利用堆来实现的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序可以说是一种利用堆的概念来排序的选择排序。堆排序的平均时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn)。分为两种方法:
- 大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列;
- 小顶堆:每个节点的值都小于或等于其子节点的值,在堆排序算法中用于降序排列;
算法思想
了解了堆的基本性质之后,我们就可以看堆排序的基本思想。
- 将未排序的序列构造成大(或者小)顶堆,根据堆的性质我们可以找到序列中的最大(或者最小)值
- 把堆首和堆尾互换,并把堆的大小减 1 1 1
- 重复上面的步骤,直到堆的大小为 1 1 1
代码实现
//===================================================================
const int M = 2e6+10;
int n, a[M] ;
//===================================================================
void max_heapify(int start, int end) {
int dad = start;
int son = dad * 2;
while (son <= end) {
if (son + 1 <= end && a[son] < a[son + 1])
son++;
if (a[dad] > a[son])
return;
else {
swap(a[dad], a[son]);
dad = son;
son = dad * 2;
}
}
}
void heap_sort(int len) {
for (int i = len / 2; i >= 1; i--)
max_heapify(i, len);
for (int i = len; i > 1; i--) {
swap(a[1], a[i]);
max_heapify(1, i - 1);
}
}