1.1简单选择排序
对a[]进行排序,每次选择未排数组内最小的元素,放到最终位置,即第i趟时,最小元素与a[i]进行交换。
空间复杂度O(1),时间复杂度O(n^2)
void sim_selSort(int a[],int n) {
int i, j, min_p;//min_p:最小元素在数组中的位置
for (i = 0; i < n - 1; i++) {
//进行逐一扫描,共n-1趟
min_p = i; //第i趟时,a[i]作为最开始的最小元素
for (j = i + 1; j < n; j++) {
//在未排序中进行扫描
if (a[j] < a[min_p]) {
//若有元素小于现最小元素,min_p定位更改
min_p = j;
}
}
if (min_p != i) {
//第i趟,最小元素不是a[i]
swap(a[i], a[min_p]); //最小元素a[min_p]交换到a[i]
}
}
return ;
}
1.2堆排序
堆包括:大根堆、小根堆
以大根堆为例:满足a[i]>=a[2i] && a[i]>=a[2i+1] ,每一个非叶子结点的数都大于其子结点,即都是大根堆。
对a[]进行排序:
①初始堆:将原数组a[]以完全二叉树的形式生成初始堆(代码无需额外处理)
②建堆:从最小的非叶子结点开始处理,该结点与其叶子结点比较,数值最大的放在双亲结点,直到根结点
③推出堆顶元素后:堆最后一个元素代替堆顶,再重复进行建堆操作,直到所有元素出堆
空间复杂度O(1),时间复杂度O(nlog2n)
每次调整(插入/删除)的时间复杂度O(h)->O(log2n)
代码:
//建堆、调整堆
void heapAdjust(