算法导论之排序和顺序统计学
2016-06-02 15:23
260 查看
排序:对N个数的序列重排过程。待排序的数,一般是选择记录中数据集的关键字key作为排序的值,而数据集中其他数据(称为:卫星数据)以key为中心移动。实际上,对于排序过程中,key的移动和交换,卫星数据并不定跟着,只要记录的指针随key交换即可,将数据移动量减小到最小。
关键字和卫星数据所构成的数据集,在实际排序应用中,不单只关注关键字序列,还关心卫星数据的存储结构,在选用具体排序算法中有一定考量。排序算法分为:
1)比较排序:插入排序、合并排序、堆排序、快速排序,对数组中的元素进行比较来实现排序;
2)非比较排序:计数排序、基数排序,利用非比较的其他方法来获得数组的排序信息;
每种排序算法都要考量其运行时间和存储空间的性能,各有其应用优点。插入排序的最坏情况运行时
1)Maximum(S),返回S中最大关键字的元素,在最大堆A中返回根节点即可,算法如下:
Fun_heap_maximum(A){
return A[1];
}
2)Extract_max(S),去掉并返回S中最大关键字的元素,在最大堆A中去掉最大值后需要重新调整保持最大堆性质,算法如下:
Fun_heap_extractmax(A){
max=A[1];//返回最大值
A[1]=A[heapsize[A]];//将最后一个节点的值,交换到第一个节点
Heapsize[A]= Heapsize[A]-1;//堆大小减1
Fun_max_heapify(A,1);//保持最大堆性质函数
return max;
}
Fun_max_heapify(A,i){
l=left(i);
r=right(i);
if l<=heapsize[A] and A[l]>A[i]
then largest=l
else largest=i
if r<=heapsize[A] and A[r]>A[largest]
then largest=r
if largest ≠ i
then exchange(A[i],A[largest])
Fun_max_heapify(A,largest)
}
3)IncreaseKey(S,x,k),将元素x的关键字的值增加到k,在最大堆A中操作就是赋值x元素的新关键字值,并保持堆性质,算法如下:
Fun_heap_IncreaseKey(A,i,key){
A[i]=key;//赋值key
while i>1 and A[parent(i)]<A[i]
do exchange(A[i],A[parent(i)]
i=parent[i]
}
4)Insert(S,x),新增元素x到集合S,即是插入一个元素关键字key到一个已建成的最大堆A中,插入算法如下:
Fun_maxHeap_Insert(A,key){
heapsize[A]=heapsize[A]+1;//堆大小加1
A[heapsize[A]]=-∞;//新增叶节点,关键值为负无穷大
Fun_heap_IncreaseKey(A, heapsize[A],key);//新增叶子节点插入的值,可按照IncreaseKey来操作
}
最小优先级队列支持的操作类似,应用最小堆,用在基于事件驱动的模拟器中。
关键字和卫星数据所构成的数据集,在实际排序应用中,不单只关注关键字序列,还关心卫星数据的存储结构,在选用具体排序算法中有一定考量。排序算法分为:
1)比较排序:插入排序、合并排序、堆排序、快速排序,对数组中的元素进行比较来实现排序;
2)非比较排序:计数排序、基数排序,利用非比较的其他方法来获得数组的排序信息;
每种排序算法都要考量其运行时间和存储空间的性能,各有其应用优点。插入排序的最坏情况运行时
1)Maximum(S),返回S中最大关键字的元素,在最大堆A中返回根节点即可,算法如下:
Fun_heap_maximum(A){
return A[1];
}
2)Extract_max(S),去掉并返回S中最大关键字的元素,在最大堆A中去掉最大值后需要重新调整保持最大堆性质,算法如下:
Fun_heap_extractmax(A){
max=A[1];//返回最大值
A[1]=A[heapsize[A]];//将最后一个节点的值,交换到第一个节点
Heapsize[A]= Heapsize[A]-1;//堆大小减1
Fun_max_heapify(A,1);//保持最大堆性质函数
return max;
}
Fun_max_heapify(A,i){
l=left(i);
r=right(i);
if l<=heapsize[A] and A[l]>A[i]
then largest=l
else largest=i
if r<=heapsize[A] and A[r]>A[largest]
then largest=r
if largest ≠ i
then exchange(A[i],A[largest])
Fun_max_heapify(A,largest)
}
3)IncreaseKey(S,x,k),将元素x的关键字的值增加到k,在最大堆A中操作就是赋值x元素的新关键字值,并保持堆性质,算法如下:
Fun_heap_IncreaseKey(A,i,key){
A[i]=key;//赋值key
while i>1 and A[parent(i)]<A[i]
do exchange(A[i],A[parent(i)]
i=parent[i]
}
4)Insert(S,x),新增元素x到集合S,即是插入一个元素关键字key到一个已建成的最大堆A中,插入算法如下:
Fun_maxHeap_Insert(A,key){
heapsize[A]=heapsize[A]+1;//堆大小加1
A[heapsize[A]]=-∞;//新增叶节点,关键值为负无穷大
Fun_heap_IncreaseKey(A, heapsize[A],key);//新增叶子节点插入的值,可按照IncreaseKey来操作
}
最小优先级队列支持的操作类似,应用最小堆,用在基于事件驱动的模拟器中。
相关文章推荐
- c 关键字extern
- 百度BAE2.0 JAVA环境项目部署和调试
- Codeforces Round #355 (Div. 2) C. Vanya and Label 水题
- 课堂练习——买书问题
- js 日期大小比较
- 计算机图形学基础(零) 介绍
- GoEasy如何取消订阅呢
- 微信自定义菜单集成多客服功能的方法与总结
- 奥妙重重的Fibonacci数列
- 添加系统用户,从一个文件列表里。
- J2ee项目从0搭建(三):eclipse中用Maven创建Web项目
- JSP入门详解
- Asp.net MVC中的ViewData与ViewBag
- 面试必备之快速排序
- Java静态导入
- 详解Python中的__new__、__init__、__call__三个特殊方法
- jQuery.extend 函数详解
- Mysql两种安装方式比较
- INVALID BINARY : Your binary is not optimized for iPhone 5 As of May 1
- 【BZOJ1300】[LLH邀请赛]大数计算器【快速幂】【姿势】