堆排序
时间:2022-04-22
本文章向大家介绍堆排序,主要内容包括算法思想:、主要代码:、全部代码:、运行示例:、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
构建堆的时间复杂度为O(n),而第I次调整堆的时间复杂度为O(logi),因此,无论什么情况下时间复杂度都为O(nlogn)。
算法思想:
首先,对数组从n/2处开始进行创建堆。大顶堆就是顶点总是大于它的子节点,而小顶堆就是定点总是小于它的子节点。
因此,构建时,对节点与他的孩子进行比较,如果创建的是大顶堆,那么就把最大的孩子跟自己进行比较,比自己大,就进行替换。依次类推。
最后把最顶点的与最后一个元素进行替换,在进行堆的调整,此时的调整,相当于调整最顶点的元素。
主要代码:
void heapSort(int *arr,int length){
int i;
for(i=length/2; i>0; i--){
sort(arr,i,length);
}
for(i=length; i>0; i--){
int k = arr[0];
arr[0] = arr[i-1];
arr[i-1] = k;
sort(arr,1,i-1);
}
}
void sort(int *arr,int s,int length){
int temp,i;
temp = arr[s-1];
for(i=2*s; i<=length; i*=2 ){
if(i<length && arr[i-1] < arr[i])
i++;
if(temp >= arr[i-1])
break;
arr[s-1] = arr[i-1];
s = i;
}
arr[s-1] = temp;
}
全部代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int arrtest1[10] = {3,4,7,8,0,9,1,2,6,5};
int arrtest2[10] = {0,1,2,3,4,5,6,7,8,9};
int arrtest3[10] = {9,8,7,6,5,4,3,2,1,0};
void copy(int *from,int *arr,int length);
void print(int *arr,int length);
void heapSort(int *arr,int length);
void sort(int *arr,int s,int length);
int main(){
clock_t start,end;
int Arr[10];
int i;
copy(arrtest1,Arr,10);
print(Arr,10);
heapSort(Arr,10);
print(Arr,10);
start = clock();
for(i=0;i<100000;i++){
copy(arrtest1,Arr,10);
//print(Arr,10);
heapSort(Arr,10);
//print(Arr,10);
}
end = clock();
printf("first test:%dn",end-start);
start = clock();
for(i=0;i<100000;i++){
copy(arrtest2,Arr,10);
//print(Arr,10);
heapSort(Arr,10);
//print(Arr,10);
}
end = clock();
printf("first test:%dn",end-start);
start = clock();
for(i=0;i<100000;i++){
copy(arrtest3,Arr,10);
//print(Arr,10);
heapSort(Arr,10);
//print(Arr,10);
}
end = clock();
printf("first test:%dn",end-start);
getchar();
return 0;
}
void heapSort(int *arr,int length){
int i;
for(i=length/2; i>0; i--){
sort(arr,i,length);
}
for(i=length; i>0; i--){
int k = arr[0];
arr[0] = arr[i-1];
arr[i-1] = k;
sort(arr,1,i-1);
}
}
void sort(int *arr,int s,int length){
int temp,i;
temp = arr[s-1];
for(i=2*s; i<=length; i*=2 ){
if(i<length && arr[i-1] < arr[i])
i++;
if(temp >= arr[i-1])
break;
arr[s-1] = arr[i-1];
s = i;
}
arr[s-1] = temp;
}
void copy(int *from,int *arr,int length){
int i;
for(i=0;i<length;i++){
arr[i] = from[i];
}
}
void print(int *arr,int length){
int i;
for(i=0;i<length;i++){
printf("%d ",arr[i]);
}
printf("n");
}
运行示例:
- 制作Aspose CHM文档的过程记录
- 用python搭建一个校园维基网站(二)—— 可编辑内容的首页的创建
- Django博客教程(四):让 django 完成翻译—迁移数据库模型
- Calendar类中add/set/roll方法的区别
- 如何构建一个分布式爬虫(理论篇)
- Python微型Web框架Bottle源码分析
- VirtualBox相关问题总结
- Java 枚举7常见种用法
- ALI的Tensorflow炼成与GAN科普
- LaTeX内容总结
- (60) 随机读写文件及其应用 - 实现一个简单的KV数据库 / 计算机程序的思维逻辑
- java反射机制
- 突发 |“永恒之蓝”漏洞紧急应对方案
- 摩拜单车爬虫源码及解析
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- buffalo-命令
- deepin下安装向日葵依赖问题
- 前端踩坑系列《二》
- Markdown语法
- 配置ssh免密登陆,并使用命令行与服务器交互
- 使用scp进行与服务器的文件交互(上传和下载)
- Python 技术篇-文件操作:本地文件重命名
- 3种方法加密Python文件
- 用两个栈实现队列
- Python+selenium 自动化-selenium自带的截图功能
- PyQt5 技巧篇-便于文字排版的等宽字体推荐,中文为英文两倍宽字体
- php List()函数及json_encode时无法转为数组的问题
- Python 技术篇-邮件发送并展示本地图片
- PHP变量传递值的方法
- Python 技术篇-邮件发送各种类型的附件