#include <stdio.h>void swap(int *a, int *b);void HeadAdjust(int A[], int k, int n);void HeadAdjustMin(int A[], int k, int n);//简单选择排序
void SelectSort(int A[], int n) {for (int i = 0; i < n - 1; ++i) {int min = i;for (int j = i + 1; j < n; j++) {if (A[min] > A[j])min = j;}swap(&A[min], &A[i]);}
}//堆排序
//建立大根堆
void BuildMaxHeap(int A[], int len) {for (int i = len / 2; i > 0; i--) {HeadAdjust(A, i, len);}}//将以k为根的子树调整为大根堆
void HeadAdjust(int A[], int k, int n) {A[0] = A[k];for (int i = 2 * k; i <= n; i = i * 2) {//判断k有没有右孩子if (i < n && A[i] < A[i + 1])i++;if (A[0] >= A[i]) break;else {A[k] = A[i];k = i;}}A[k] = A[0];}void HeapSort(int A[], int len) {BuildMaxHeap(A, len);for (int i = len; i > 1; i--) {swap(&A[i], &A[1]);HeadAdjust(A, 1, i - 1);}
}//建立小根堆
void BuildMinHeap(int A[], int len) {for (int i = len / 2; i > 0; --i) {HeadAdjustMin(A, i, len);}
}//将以k为根的子树调整为小根堆
void HeadAdjustMin(int A[], int k, int n) {A[0] = A[k];for (int i = 2 * k; i <= n; i = i * 2) {if (i < n && A[i] > A[i + 1]) i++;if (A[0] <= A[i]) break;else {A[k] = A[i];k = i;}}A[k] = A[0];
}void HeapSortMin(int A[], int len) {BuildMinHeap(A, len);for (int i = len; i > 1; i--) {swap(&A[i], &A[1]);HeadAdjustMin(A, 1, i - 1);}
}void swap(int *a, int *b) {int t = *a;*a = *b;*b = t;
}int main(void) {printf("简单选择排序:");int A[] = {49, 38, 65, 97, 76, 13, 27, 49};SelectSort(A, 8);for (int i = 0; i < sizeof(A) / sizeof(A[0]); ++i) {printf("%d ", A[i]);}printf("\n");printf("堆排序(大根堆)");int B[] = {0, 49, 38, 65, 97, 76, 13, 27, 49};HeapSort(B, 8);for (int i = 1; i < sizeof(B) / sizeof(B[0]); ++i) {printf("%d ", B[i]);}printf("\n");printf("堆排序(小根堆)");int C[] = {0, 49, 38, 65, 97, 76, 13, 27, 49};HeapSortMin(C, 8);for (int i = 1; i < sizeof(C) / sizeof(C[0]); ++i) {printf("%d ", C[i]);}return 0;
}