排序算法-堆排序

#include <stdio.h>


void sift(int a[],int k ,int m); //调整堆
void create_heap(int a[],int n); //创建堆
void heap_sort(int a[],int n);	 //堆排序

int main(int argc,char *argv[]){
	int a[11];
	int n=10;
	int i;
	printf("输入10个数\n");
	for(i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	create_heap(a,n);
	heap_sort(a,n);
	printf("排序结果\n");
	for(i=1;i<=n;i++){
		printf("%d\t",a[i]);
	}
	printf("\n");
	
}
void sift(int a[],int k ,int m){
	int j,i;
	i=k;
	j=2*i;
	while(j<=m){	//k 有左子树
		if(j<m){	//k 有右子树
			if(a[j]<a[j+1])	//判断左右子树大小,与大的交换
				j++;
		}
		if(a[i]<a[j]){		//k 小于子树就交换
			a[i]=a[i]+a[j];
			a[j]=a[i]-a[j];
			a[i]=a[i]-a[j];
		
			i=j;			//继续向下比较
			j=2*i;
		}else{				//如果比左右子树都大 不用調整此节点
			break;
		}

	}
}

void create_heap(int a[],int n){
	int i;
	for(i=n/2;i>=1;--i){	//从 n/2 第一个非叶子节点开始調整
		sift(a,i,n);
	}
}

void heap_sort(int a[],int n){
	int i,temp;
	/*
	for(i=n/2;i>=1;--i)
		sift(a,i,n);
	*/
	for(i=n;i>1;--i){  //堆排序 n-1躺
		temp=a[1];
		a[1]=a[i];
		a[i]=temp;
		sift(a,1,i-1);  //对a1=i-1 调整

	}
}   
    
posted @ 2016-12-02 17:08  时过境迁。  阅读(119)  评论(0)    收藏  举报