堆排序源码

来源:互联网 发布:算法导论适合什么人看 编辑:程序博客网 时间:2024/06/06 03:23

堆排序源码

#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include<time.h>/*打印数组*/void MyPrint(int *arr, int len){for (int i = 0; i < len; i++){printf("%d\t", arr[i]);}printf("\n");}/*数值互换*/void MySwap(int *arr, int i, int j){int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}/*堆调整*/void HeapAdjust(int *arr, int index, int len){int lchild = index * 2 + 1;int rchild = index * 2 + 2;int max = index;if (index < len / 2){if (lchild < len && arr[lchild] > arr[max]){max = lchild;}if (rchild < len && arr[rchild] > arr[max]){max = rchild;}if (max != index){MySwap(arr, index, max);HeapAdjust(arr, max, len);}}}/*非递归堆调整*/void HeapAdjust1(int *arr, int index, int len){int lchild = index * 2 + 1;int rchild = index * 2 + 2;int max = index;while (lchild < len || rchild < len){if (lchild < len && arr[lchild] > arr[max]){max = lchild;}if (rchild < len && arr[rchild] > arr[max]){max = rchild;}if (max != index){MySwap(arr, index, max);index = max;lchild = max * 2 + 1;rchild = max * 2 + 2;}else{break;}}}void HeapSort(int *arr, int len){/*初始化堆*/for (int i = len / 2 - 1; i >= 0; i--){HeapAdjust1(arr, i, len);}for (int i = len - 1; i >= 0; i--){/*交换堆顶和末尾的元素*/MySwap(arr, 0, i);HeapAdjust1(arr, 0, i);}}/*数组生成*/int *RandomArr(int len){int *arr = (int *)malloc(sizeof(int)*len);for (int i = 0; i < len; i++){arr[i] = rand() % 10 + 50;}return arr;}int main(){srand((unsigned)time(NULL));int len = rand() % 5 + 6;int *arr = RandomArr(len);MyPrint(arr, len);HeapSort(arr, len);MyPrint(arr, len);free(arr);system("pause");return EXIT_SUCCESS;}


1 0