堆排序

来源:互联网 发布:skype6.6mac官方下载 编辑:程序博客网 时间:2024/06/06 13:21

    首先建立最大堆,然后让当前最后一个元素替换第一个元素,此时可能破环最大堆的结构,并进行堆的不断调整过程。堆排序的时间复杂度为:O(nlogn)。

#include "stdafx.h"#include <iostream>#include<algorithm>using namespace std;void heapAdjust(int a[], int i, int len) {int lchild = 2 * i;int rchild = 2 * i + 1;int max = i;if (i<=len/2){if (lchild + 1 <= len&&a[lchild] > a[max]) {max = lchild;}if (rchild+1<=len&&a[rchild]>a[max]){max = rchild;}if (max!=i){swap(a[i],a[max]);            heapAdjust(a,max,len);}}}void heapBuild(int a[], int len) {for (int i = len/2; i >=0; i--){heapAdjust(a,i,len);}}void heapSort(int a[], int len) {heapBuild(a,len);              //建立大顶堆for (int i = len-1; i >=0; i--){ swap(a[0],a[i]);         //将第一个值与最后一个值交换,将最大值移动到当前最末尾heapAdjust(a,0,i-1);     //调整堆结构}}void output(int a[], int len) {for (int i = 0; i < len; i++) {cout << a[i] << "   ";}cout << endl;}int main(){int a[6] = {96,83,27,38,11,9};int len = sizeof(a)/sizeof(a[0]);heapSort(a,len);output(a, len);return 0;}


原创粉丝点击