排序--堆排序
2017-05-20 17:26
295 查看
//.........................堆排序 /* 堆排序的两个重要步骤:初始化堆(即将待排序的数组转化成二叉堆) 将数组转换成最大堆之后,接着要进行交换数据,从而使数组成为一个真正的有序数组 堆排序的时间复杂度是O(n*lgn) 堆排序是不稳定的算法,在交换数据的时候,是比较父节点和子节点之间的数据, 所以,两个数值相等的兄弟节点,它们的相对顺序也可能发生变化 */ #if 0 #include<iostream> using namespace std; #define N 10 void HeapAdjust(int a[],int i,int n) //调整堆 { int lchild = 2*i; //i的左孩子节点序号 int rchild = 2*i+1; //i的右孩子节点序号 int max = i; if(i<=n/2) //如果i是叶节点就不用进行调整 { if(lchild<=n&&a[lchild]>a[max]) { max = lchild; } if(rchild<=n&&a[rchild]>a[max]) { max = rchild; } if(max!=i) { swap(a[i],a[max]); HeapAdjust(a,max,n); //避免调整之后以max为父节点的子树不是堆 } } } void BuildHeap(int a[],int n) //建立堆 { int i; for(i = n/2;i>=1;i--) //非叶节点最大序号值为size/2 { HeapAdjust(a,i,n); } } // 从小到大排序 得到一个最大堆 void HeapSort(int a[],int n) { int i; BuildHeap(a,n); for(i =n;i>=1;i--) { swap(a[1],a[i]); //交换堆顶和最后一个元素,即每次将剩余元素中的最大者放到最后面 HeapAdjust(a,1,i-1); //重新调整堆顶节点成为大顶堆 } } int main() { int a ; int i; for(i = 1;i<=N;i++) cin>>a[i]; HeapSort(a,N); for(i = 1;i<=N;i++) { cout<<a[i]<<" "; } cout<<endl; return 0; } #endif
相关文章推荐
- 选择排序算法---直接选择排序和堆排序
- 从排序开始(五) 堆排序
- 数据结构实验之排序四:寻找大富翁(堆排序)
- 排序算法-选择排序之堆排序
- 六大排序(选择,插入,冒泡,希尔,快排,堆排序)
- 九大排序算法及其实现- 插入.冒泡.选择.归并.快速.堆排序.计数.基数.桶排序.堆排序
- 【Java常用排序算法】选择排序(简单选择排序、堆排序)
- Java高级排序(希尔排序,快速排序,堆排序,归并排序,桶排序)
- 【算法导论】排序 (二):堆排序
- 白话讲排序系列(六) 堆排序(绝对让你明白堆排序!)
- 算法 排序 python 实现--堆排序
- 排序六 堆排序
- 【数据结构之排序7】堆排序
- Java-时间复杂度为O(nlogn)的排序算法(快速排序, 归并排序, 堆排序, 希尔排序)
- 排序篇(5)--堆排序
- 内部排序之堆排序
- 3.找实习笔记三:用python写排序(三) 堆排序
- 排序算法复习(Java实现)(二): 归并排序,堆排序,桶式排序,基数排序
- 【排序】堆排序
- java实现各种基础排序(冒泡排序、快速排序、直接选择排序、堆排序、直接插入排序、归并排序)