几种改良的排序,堆排序,希尔排序,快速排序--堆排序篇(改良的选择排序算法)
2016-11-27 20:47
561 查看
using namespace std;
/*除第i个节点,i的下面的节点都已经满足堆的定义时,调用headWithHead之后,成为最大堆。*/
void heatWithHead(int *p,int i,int m)
{
int tmp,j;
tmp=p[i];
for(j=2*i+1;j<m;j=2*j+1){
if(j<m-1&&p[j]<p[j+1]){
j++;
}
if(tmp>p[j]){
break;
}
p[i]=p[j];
i=j;
}
p[i]=tmp;
}
//heat是一个完整的建堆过程,执行后得到一个有序的,堆(上小下大) void heat(int *p,int m){ int j,tmp; for (j=(m-1)/2;j>=0;j--){/*这里从最后一个节点的父节点进行第一个函数操作(叶子节点的节点构成的树肯定满足最大堆定义,循环结束后得到一个最大堆)*/ heatWithHead(p,j,m); } for(j=m-1;j>0;j--){/*循环将最大堆第一个最大的树和堆最后一个数交换,最后的数变成最大的数,利用第一个函数,将除最大的数外的堆变成最大堆,循环得到有序堆*/) tmp=p[j]; p[j]=p[0]; p[0]=tmp; heatWithHead(p,0,j); } }
//测试代码 int main() { int arr[10]={1,9,5,85,65,44,74,43,76,75}; int i; heat(arr,10); for(i=0;i<10;i++){ cout<<arr[i]<<" "; } return 0; }
//这是改良后,模板函数的方法,思路一样
template <typename T> void adjustDui(T *p,int start,int size) { int i; T tmp=p[start]; for(i=start*2+1;i<size;i=2*i+1){ if(i+1<size&&p[i]<p[i+1]){ i++; } if(tmp>p[i]){ break; } p[start]=p[i]; start=i; } p[start]=tmp; } template<typename T,int size> void duiPaiXu(T *p) { int i; T tmp; for(i=(size-1)/2;i>=0;i--){ adjustDui<T>(p,i,size); } for(i=size-1;i>0;i--){ tmp=p[0]; p[0]=p[i]; p[i]=tmp; adjustDui<T>(p,0,i); } }
相关文章推荐
- 几种常见排序算法之Java实现(插入排序、希尔排序、冒泡排序、快速排序、选择排序、归并排序)
- 笔试面试最常涉及到的12种排序算法(包括插入排序、二分插入排序、希尔排序、选择排序、冒泡排序、鸡尾酒排序、快速排序、堆排序、归并排序、桶排序、计数排序和基数排序)进行了详解。每一种算法都有基本介绍、算
- 算法分析中最常用的几种排序算法(插入排序、希尔排序、冒泡排序、选择排序、快速排序,归并排序)C 语言版
- 基本的排序算法:冒泡排序、插入排序、希尔排序、选择排序、归并排序、快速排序、堆排序
- 几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 10种算法原理(冒泡排序,选择排序,快速排序,堆排序,希尔排序,桶排序等)
- 选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法,而冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。
- 几种常用的排序算法(快速排序,希尔排序,堆排序,选择排序,冒泡排序)
- 几种常见的排序算法,选择排序,冒泡排序,希尔排序,堆排序,快速排序,归并排序,基数排序的比较
- 选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法,而冒泡排序、插入排序、归并排序和基数排序
- 几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 10种算法原理(冒泡排序,选择排序,快速排序,堆排序,希尔排序,桶排序等)
- 元素排序几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 【算法】希尔排序,快速排序,选择排序,插入排序,冒泡排序
- 选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法
- 冒泡排序、选择排序、堆排序、快速排序、插入排序算法复杂度分析与算法实现(自己总结与转)
- 六、内部排序综合(九种)—插入类排序(直接插入、折半插入、希尔排序);交换类排序(冒泡、快速);选择类排序(简单选择、堆排序);二路归并排序;基数排序
- 面试珠玑 快速排序、希尔排序、插入排序、选择排序、归并排序、堆排序总结
- 冒泡排序、选择排序、堆排序、快速排序、插入排序算法复杂度分析与算法实现(自己总结与转)
- C# 插入排序 冒泡排序 选择排序 快速排序 堆排序 归并排序 基数排序 希尔排序