简单选择排序
//简单选择排序
void SelectSort(int A[], int n) {
for (int i = 0; i < n - 1; i++) {//一共进行i-1趟
int min = i;//记录最小元素位置
for (int j = i + 1; j < n; j++) {//在A[i...n-1]中选择最小的元素
if (A[j] < A[min])
min = i;//更新最小元素位置
if (min != i)
swap(A[min], A[j]);//封装的swap()函数共移动元素3次
}
}
}
//交换
void swap(int& a, int& b) {
int temp = a;
a = b;
b = temp;
}
堆排序
//堆排序
//建立大根堆
void BuildMaxHeap(int A[], int len) {
for (int i = len / 2; i > 0; i--) {//从后往前调整所有非终端结点
HeadAdjust(A, i, len);
}
}
void HeadAdjust(int A[], int k, int len) {
A[0] = A[k];//A[0]暂存子树的根结点
for (int i = 2 * k; i <= len; i *= 2) {//沿key较大的子结点向下筛选
if (i < len && A[i] < A[i + 1])
i++;//取key较大的子结点的下标
if (A[i] <= A[0]) break;//筛选结束
else {
A[k] = A[i];//将A[i]调整到双亲结点上
k = i;//修改k值,以便继续向下筛选
}
}
A[k] = A[0];//被筛选结点的值放入最终位置
}
//堆排序的完整逻辑
void HeapSort(int A[], int len) {
BuildMaxHeap(A, len);//初始建堆
for (int i = len; i > 1; i--) {//n-1趟的交换和建堆过程
swap(A[i], A[1]);//堆顶元素和堆底元素交换
HeadAdjust(A, 1, i - 1);//把剩余的待排序元素整理成堆
}
}