天天看點

堆排序

#include<stdio.h>

//建堆函數

void HeapAdjust(int H[],int s,int m){

  int top=H[s];

  for(int j=2*s;j<=m;j*=2){

    if(j<m&&H[j]<H[j+1])j++;

    if(top>=H[j])break;

    H[s]=H[j];s=j;

  }

  H[s]=top;

}

void swap(int &a,int &b){

  int temp=a;

  a=b;

  b=temp;

//堆排序

void HeapSort(int H[],int size){

  for(int i=size/2;i>=0;i--)

    HeapAdjust(H,i,size-1);

  for(int j=size-1;j>0;j--){

    //交換元素,把最大元素放到隊尾

    swap(H[0],H[j]);

    //對剩餘元素進行建堆

    HeapAdjust(H,0,j-1);

int main(){

  int    arr[]={3,6,2,4,7,6,2,9,17};

    HeapSort(arr,9);

    for(int i=0;i<9;i++){

     printf("%d%s",arr[i]," ");

    }

    int j;

    scanf("%d",&j);

繼續閱讀