- 堆排序
- 基本思想
- 步骤
- By C++
- By Golang
堆排序
基本思想
步骤
By C++
#include <stdio.h>#define MaxSize 100typedef int KeyType; /*关键字类型*/typedef char ElemType[10]; /*其他数据项类型*/typedef struct{KeyType key; /*关键字域*/ElemType data; /*其他数据域*/} LineList; /*线性表元素类型*/void Sift(LineList R[],int low,int high){int i=low,j=2*i; /*R[j]是R[i]的左孩子*/LineList tmp=R[i];while (j<=high){ if (j<high && R[j].key<R[j+1].key) /*若右孩子较大,把j指向右孩子*/j++; /*j变为2i+1,指向右孩子结点*/if (tmp.key<R[j].key){ R[i]=R[j]; /*将R[j]调整到双亲结点位置上*/i=j; /*修改i和j值,以便继续向下筛选*/j=2*i;}else break; /*筛选结束*/}R[i]=tmp; /*被筛选结点的值放入最终位置*/}void HeapSort(LineList R[],int n){int i;LineList tmp;for (i=n/2;i>=1;i--) /*循环建立初始堆*/Sift(R,i,n);for (i=n;i>=2;i--) /*进行n-1次循环,完成堆排序*/{ tmp=R[1]; /*将第一个元素同当前区间内R[1]对换*/R[1]=R[i];R[i]=tmp;Sift(R,1,i-1); /*筛选R[1]结点,得到i-1个结点的堆*/}}void main(){LineList R[MaxSize];KeyType a[]={0,75,87,68,92,88,61,77,96,80,72}; /*有效数据从a[1]开始*/int n=10,i;for (i=0;i<=n;i++)R[i].key=a[i];printf("排序前:");for (i=1;i<=n;i++)printf("%3d",R[i].key);printf("\n");HeapSort(R,n);printf("排序后:");for (i=1;i<=n;i++)printf("%3d",R[i].key);printf("\n");}
By Golang
go
