堆排序
2018-03-29 15:14
218 查看
1、主要步骤:
1)建堆2)筛选:自堆顶至叶子调整
2、代码
void heapAdjust(int data[], int s, int m) //默认是按照大顶堆调整 { int temp = data[s]; for (int j = 2 * s; j <= m; j *= 2) { if (j < m && data[j] < data[j + 1]) ++j; //只有j<m,才有左子树,也就是++j if (data[j] < temp) break; data[s] = data[j]; s = j; } data[s] = temp; } void heapSort(int data[], int len) { for (int i = len / 2; i > 0; --i) //建堆 heapAdjust(data, i, len); for (int i = len; i > 1; --i) { swap(data[1], data[i]); //取出堆中目前最大的数,和最后一个交换 heapAdjust(data, 1, i - 1); //调整,重新成为一个大顶堆 } } int main(int argc, char *argv[]) { int data[20] = { 0, 1, 7, 3, 50, 43, 34, 78, 23, 67, 90 }; //第0个位置不用 heapSort(data, 10); int i = 1; while (i <= 10) //输出 { cout << data[i] << ' '; ++i; } system("pause"); return 0; }
3、时间复杂度
堆建完后,一共需要取n-1次数,也就是要调整堆n-1次。每一次调整至多需要比较2(k-1)次,k为树的深度(约logn)。所以建堆完后的时间复杂度是nlogn。而这个过程要比第一步建堆的时间复杂度高(这里就不算了),所以整个过程的时间复杂度也就是nlogn。相关文章推荐
- LeetCode 147. Insertion Sort List插入排序链表的高效简单解法
- pandas通过索引进行排序
- mysql 单表排序,相同值排序
- 排序算法复习——选择类排序
- 冒泡、选择、插入三种排序
- 各种排序方法java实现
- 九度OJ—题目1066:字符串排序
- 各种排序
- Comparator对Map排序!
- PAT 数据结构 08-排序6. PAT Judge (25)
- 排序
- 选择排序——简单选择排序
- jave 对List 数组中的对象按照多个字段排序
- 华为研发笔试(随机数查重删除并排序)
- 一个数组按照另一个数组排序方法
- 排序 Wooden Sticks
- SQL-order by两个字段同时排序
- 数组排序函数总结
- 数据结构实验之排序六:希尔排序
- JAVA compareTo实现treeSet()排序