#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; }
c语言数据结构--------选择排序
于 2025-04-22 15:41:28 首次发布