首页 > 代码库 > 堆排序
堆排序
堆排序
堆排序_百度百科
堆排序_维基百科
堆_百度百科
堆 (数据结构)_维基百科
堆排序是和快排、归并排序一样常见的复杂度为o(nlogn)的算法,速度比较快。
那么,要进行堆排序,首先要把n个数据进行最大堆化(也就是把整个数据整理成一个最大堆)
这样子首元素就是数组最大的元素了。把它和最后的元素进行交换,那么就可以得到最后的元素是最大的。
如此类推,由于最后一个元素已经是有序的,对前面n-1个元素再进行堆调整,
inline void sort_branch(int nums[], int start, int end) { // sorts a branch making the maxinum in the brach to the root // @Param |nums|: the data array regarded as a heap // @|start|: the beginning index of |nums| // @|end|: the non-include end index of |nums| int larger_child; // find the larger child and record the node // from node(|root|) // each time we search the larger child for the next step // loop until we have moved all larger child nodes to the upper node for (int root = start; 2 * root + 1 < end; root = larger_child) { larger_child = 2 * root + 1; // first dim larger_child as the left_child if (larger_child < end - 1 && nums[larger_child + 1] > nums[larger_child]) larger_child++; if (nums[root] < nums[larger_child]) swap(nums[root], nums[larger_child]); else break; }}inline void heap_sort(int nums[], int start, int end) { // sort with a maxinum heap. // @Param |nums|: the data array regarded as a heap // @|start|: the beginning index of |nums| // @|end|: the non-include end index of |nums| // build up a maxinum heap for the first time for (int i = end / 2; i >= start; i--) sort_branch(nums, i, end); // Now, the max number of |nums| between |start| and |end|-1 is |nums[start]| // for we have built up a maxinum heap. Then swap it with the last number // so the last number will be the largest. // Then sort the branch from the root to find the next maxinum number and // do the same again. Loop until there is only an element left, which means // we have sorted all elements for (int j = end - 1; j > start; j--) { swap(nums[0], nums[j]); sort_branch(nums, start, j); }}
堆排序
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。