堆排序

来源:互联网 发布:马略改革 知乎 编辑:程序博客网 时间:2024/06/05 12:49

之前学过,但是没有写过。今天有练习的必要,就写了一遍。

//堆排序#include <bits/stdc++.h>using namespace std;void swap(int &a, int &b){     a^=b;     b^=a;     a^=b;}void heapAdjust(int a[] , int start_pos , int length){ // 将数组0-(length-1)调整成大顶堆    int nChild ;    int nTemp;    int i = start_pos ;    for (;i*2+1<length ; i = nChild){          nChild = 2*i+1; //左孩子          if (nChild<length-1 && a[nChild]<a[nChild+1]) nChild++;          if ( a[nChild]>a[i] ){          swap(a[i],a[nChild]);          }          else            break;    }}void heapSort (int a[] , int length){//堆排序        //将数组调整成大顶堆        for (int i = length/2-1; i >=0 ;--i){            heapAdjust(a,i,length);        }        for (int i  = length - 1 ; i>0 ;--i){            swap(a[i],a[0]);//交换第一个和最后一个,让前i个的最大元素位于ai            heapAdjust(a,0,i);        }}int main(){ int n ; int a[100]; cin >> n ; for (int i = 0 ; i < n ; ++i) cin>> a[i]; heapSort(a,n);  for (int i = 0 ; i < n ; ++i) cout<< a[i] <<" "; return 0;}




0 0