堆排序
a.
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
b.
平均时间复杂度:O(n log n)
c.
实现
将序列按堆的定义建成堆(如大根堆),从而堆顶的关键字最大,将堆顶与堆末交换,这趟得到了最大数,并把末元素从堆中去掉,然后在将堆顶调整为堆,从而堆顶为次大数,如此反复,只到堆中只剩一个元素为止,此时数组的元素为递增序列
d.
C语言
#include<stdio.h>
void Heapadjust(int R[],int s,int m){ //s使R[s]到R[m]为大根堆
int i;
i=s;
int temp=R[i];
for(int j=2*i+1;j<=m;j=2*j+1){
if(j<m && R[j]<R[j+1]){ j++; }
if(temp>=R[j]) break;
R[i]=R[j];
i=j;
}
R[i]=temp;
}
void HeapSort(int R[],int n){//将数组R[0]到R[n-1]中的n个整数进行堆排序
int i;
int temp;
for(i=n/1-1;i>0;i--){
Heapadjust(R,i,n-1);
}
for(i=n-1;i>0;i--){
temp=R[0];
R[0]=R[i];
R[i]=temp;
Heapadjust(R,0,i-1);
}
}
void main(){
int n[10];
printf("请输入10个数,以逗号隔开:");
scanf("%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",&n[0],&n[1],&n[2],&n[3],&n[4],&n[5],&n[6],&n[7],&n[8],&n[9]);
HeapSort(n,10);
for(int i=0;i<=9;i++){
printf("%d ",n[i]);
}
printf("\n");
}
运行
C++
ShiftDown函数(下移)
id ShiftDown(int Heap[],int i,int N) //过程名(数组名,下移元素下标,堆长度){
int t;
if(2*i>N)
return; //该结点是叶子
do{
i=i*2;
if(i+1<=N && Heap[i+1]>Heap[i])
i++; //
i=i*2+2(若要提升,则选择大者)
if(Heap[i/2]<Heap[i])
t=Heap[i/2],Heap[i/2]=Heap[i],Heap[i]=t;
else
break;
}while(2*i<=N);
}
MakeHeap函数(创建堆)
#include "ShiftDown.h"
void MakeHeap(int Heap[],int N)
{
for(int i=N/2;i>0;i--)
ShiftDown(Heap,i,N);
}
堆排序
#include <iostream.h>
#include "MakeHeap.h"
void HeapSort(int Heap[],int N)
{
MakeHeap(Heap,N);
int t,Len=N;
for(int i=N;i>1;i--){
t=Heap[i],Heap[i]=Heap[1],Heap[1]=t; //将最大元素和尾部元素互换
--Len;
ShiftDown(Heap,1,Len);
}
}
void main()
{
int A[]={NULL, //A[0]不使用
20,17,99,10,11,4,5,3,7,10,90
};
const int N=sizeof(A)/sizeof(int)-1;
for(int i=1;i<=N;i++)
cout<<A[i]<<' ';
cout<<endl;
HeapSort(A,N);
for(i=1;i<=N;i++)
cout<<A[i]<<' ';
cout<<endl;
}
运行