C算法--堆排序

来源:互联网 发布:数据库服务器部署 编辑:程序博客网 时间:2024/05/18 02:55
   每天学点算法<img alt="奋斗" src="http://static.blog.csdn.net/xheditor/xheditor_emot/default/struggle.gif" />
   堆排序算法是完全二叉树的形式,通过调整树节点上的值得位置,既不断地把最大的值调到根节点上,从最下的一个树开始,比较给个小二叉树的值,最终把最大的值调整到根节点上,  排序过程是:把根节点既a[0](最大值),末节点a[i-1]交换数值,排除i-1,继续递归,一直到剩下最后一个节点,排序完成。用别人的图示:
<span style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 15px; line-height: 27px;"><span style="white-space:pre"></span>建立初始的堆结构如图:</span>
<img src="http://img.blog.csdn.net/20151225141211926?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
<span style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 25.2px;">然后,交换堆顶的元素和最后一个元素,此时最后一个位置作为有序区(有序区显示为黄色),然后进行其他无序区的堆调整,重新得到大顶堆后,交换堆顶和倒数第二个元素的位置……</span>
<span style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 25.2px;"><img src="http://img.blog.csdn.net/20151225141410116?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /></span>
<span style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 25.2px;">大致就是这个意思吧,学习了,感谢博主们的无私奉献。</span>
#include "stdafx.h"#include <iostream>using namespace std;void HeapAdjust(int *a, int i, int size){int left = 2 * i + 1;int right = 2 * i + 2;int max = i;if (i <= size){if (left<size&&a[left]>a[max]){max = left;}if (right<size&&a[right]>a[max]){max = right;}if (max != i){swap(a[i], a[max]);HeapAdjust(a, max, size);cout << "    " << a[i] << endl;}}}void HeapSort(int a[], int n){for (int i = n / 2 - 1; i >= 0; --i){HeapAdjust(a, i, n);}//排序 将最大的放后面for (int i = n - 1; i > 0; i--){swap(a[i], a[0]);cout << a[i] << endl;HeapAdjust(a, 0, i);}}



/*************************************************************************  @Author : Yan Gan*  @  Date :2015 /12/25*  @ Email : *  function: 算法集合************************************************************************/#include "stdafx.h"#include <iostream>using namespace std;void HeapSort(int a[],int n);int main(){int a[] = {60,70,12,40,8,30,10};cout << " " << sizeof(a) / sizeof(a[0]) << endl;//添加排序算法HeapSort(a, sizeof(a)/sizeof(a[0]));for (int i = 0; i<sizeof(a) / sizeof(a[0]);i++){cout << " " << a[i];}return 0;}

0 0
原创粉丝点击