堆的建立及堆排序
阿新 • • 發佈:2018-12-06
以下內容展示了堆的建立,在堆中刪除和插入元素等操作。
#include<stdio.h> #define MAX 15 void makeHeap(int a[],int n); void swap(int *a,int *b); void sift_down(int a[],int s,int n); void sift_up(int a[],int s); void heapSort(int a[],int n); void visit(int a[],int n); void insert(int a[],int elem,int *n); void hdelete(int a[],int i,int &n); int main() { int n,i; int a[MAX]; FILE*fp; fp=fopen("F:\\Homework\\c\\123.txt","r");//資料來源於檔案 printf("enter n:\n"); scanf("%d",&n); for(i=1;i<=n;i++) //從陣列‘1’位置開始 fscanf(fp,"%d",&a[i]); fclose(fp); visit(a,n); makeHeap(a,n); heapSort(a,n);
visit(a,n);
return 0;
}
void makeHeap(int a[],int n)
{
int i;
for(i=n/2;i>=1;i--) //從最後一個帶有子節點的父節點開始調整,直至根節點。
sift_down(a,i,n);
printf("Makeheap successfully!\n");
}
void swap(int *a,int *b) //交換兩個數
{
int temp;
temp=*a;
*a=*b;
*b=temp;
}
//功能:對位置為s的節點進行向下調整
//s表示待調整的位置,n表示堆中元素的個數
void sift_down(int a[],int s,int n) // { int child=2*s; int index; while(child<=n) { if(child+1<=n) a[child]>a[child+1]?index=child:index=child+1; else index=child; if(a[s]<a[index]) { swap(&a[s],&a[index]); if(index==child) /*********重要!!!********/ s=child; else s=child+1; child=2*s; } else return; } } //功能:對位置為s的元素進行上調整 void sift_up(int a[],int s) { while(s/2>=1) { if(a[s]>a[s/2]) { swap(&a[s],&a[s/2]); s=s/2; } else break; } } void heapSort(int a[],int n) { int i; for(i=n;i>=1;i--) { swap(&a[1],&a[i]); sift_down(a,1,i-1); } printf("sort successfully!\n"); } void visit(int a[],int n) { int i; for(i=n;i>=1;i--) printf("%d ",a[i]); printf("\nvisit all\n"); } void insert(int a[],int elem,int *n) { if(*n+1<=MAX) { (*n)++; a[*n]=elem; sift_up(a,*n); } visit(a,*n); } void hdelete(int a[],int i,int &n) { swap(&a[i],&a[n]); n--; if(a[i]>a[n]) sift_down(a,i,n); else sift_up(a,i); }