堆化函数heapify: 维护堆的性质,将当前节点及其子树调整为最大堆。 比较当前节点、左子节点和右子节点的值,找到最大值并交换。 递归调整子树,确保整个树满足堆的性质。 堆排序函数heapSort: 首先将数组构建为最大堆。 逐个将最大值(根节点)移动到数组末尾,并调整剩余部分为最大堆。 打印数组函数printArray: ...
}// 主函数:堆排序voidheapSort(intarr[],intn){// 构建最大堆for(inti = n /2-1; i >=0; i--) heapify(arr, n, i);// 提取元素并重新调整堆for(inti = n -1; i >=0; i--) { swap(&arr[0], &arr[i]);// 将堆顶元素与末尾元素交换heapify(arr, i,0);// 调整剩余元素为最...
heapSort函数:首先通过从最后一个非叶子节点开始自下而上调用heapify函数来建堆。然后,通过交换根节点(最大值)与数组末尾元素,并减少堆的大小,再对新的根节点调用heapify函数来维护堆的性质,直至整个数组有序。 main函数:定义了一个待排序的数组,调用heapSort函数进行排序,并打印排序后的数组。
}voidheapSort(int* pa,intn) {//对大根堆进行排序inti =0;for(i = n /2-1; i >=0; i--) heapify(pa, n, i);for(i = n -1; i >0; i--) {//由于大根堆的性质,数组首元素存放的值,也就是二叉树根结点的值是数组中最大的值,swap(&pa[i], &pa[0]);//然后将数组首元素的值(...
Heapify(arr, 1, i - 1); } } === 8、计数排序(Counting Sort) 计数排序不是基于比较的排序算法,其核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。 作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。 8.1 算法描述 找出待排序的数组中最大和最小的元素; 统计数组...
heapify(tree, i, 0); } } 算法分析 堆排序是不稳定排序,适合数据量较大的序列,它的平均时间复杂度为 Ο(nlogn),空间复杂度为 O(1)。 此外,堆排序仅需一个记录大小供交换用的辅助存储空间。 归并排序 归并排序(Merge Sort)是建立在归并操作上的一种排序算法。它和快速排序一样,采用了分治法。
* 堆化 */voidheapIfy(Heap*heap){int idx=(heap->len-2)>>1;for(int i=idx;i>=0;i--){heapShiftDown(heap,i);}}/** * 堆打印 */voidheapPrint(Heap*heap){for(int i=0;i<heap->len;i++){printf("%d ",heap->innerArr[i]);}printf("\n");}/** ...
Heapify(arr, i, size); } } void swap(int *arr, int i, int j) { int tmp; tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } void HeapSort(int *arr, int size) { int i; BulidHeap(arr, size);
int len) { // 构建初始堆(最小堆) for (int i = len / 2 - 1; i >= 0; --i) heapify(arr, len, i); // 依次取出堆顶元素并调整堆 for (int i = len - 1; i >= 0; --i) { // 将堆顶元素与最后一个元素交换 swap(&arr[0], &arr[i]); // 调整堆 heapify(arr, i, 0...
}//建堆voidbuildHeap(intarr[],intlen) {inti;for(i = len /2-1; i >=0; i--) { heapify(arr, i, len); } }//排序voidheapSort(intarr[],intlen) {inti, temp; buildHeap(arr, len);for(i = len -1; i >0; i--) { ...