堆排序

来源:互联网 发布:单片机modbus通讯程序 编辑:程序博客网 时间:2024/05/17 07:19

思想:将数组转为二叉树,调整为最大堆,然后将第一个数与末尾数交换,在调整最大堆,重复步骤


#include <stdio.h>//输出void print(int array[], int size){int i = 0;for(i = 0; i < size; i++){printf("%d ", array[i]);}printf("\n");}//两数交换void swap(int *a, int *b){int temp = *a;*a = *b;*b = temp;}//调整最大堆void maxHeapify(int array[], int i, int size){int left = i * 2 + 1;   //采用索引值计算,数组第一个下标从0开始int right  = i * 2 + 2;int max_index = 0;if(right >= size || left >= size)//大于数组大小返回{return;}//比较出根、左节点、右节点最大的if(array[left] > array[i]){max_index = left;}else{max_index = i;}if(array[right] > array[max_index]){max_index = right;}//如果最大的不为根节点,则进行交换,//并对进行交换的子节点进行对调整if(max_index != i){swap(&array[i], &array[max_index]);maxHeapify(array, max_index, size);}}//建立最大堆void build_max_heap(int array[], int size){//计算第一个根节点的下标int index = (size - 2) / 2;int i = 0;//从下往上进行根节点遍历for(i = index; i > -1; i--){maxHeapify(array, i, size);}}void heap_sort(int array[], int size){//建立最大堆build_max_heap(array, size);while(size != 1){//交换第一个节点和最后一个节点swap(&array[0], &array[size - 1]);//堆大小减一,因为最后一个数为最大,为已排序的数size--;//调整堆maxHeapify(array, 0, size);}}int main(){int array[] = {23, 45, 2, 54, 34, 3, 67, 234, 3, 67, 57};heap_sort(array, 11);int i = 0; print(array, 11);return 0;}


0 0
原创粉丝点击