堆排序 两种实现(最小堆和最大堆)

堆排序算法是建立在二叉树的堆结构上的,通过交换堆(一维数组)中的元素,并进行上浮或下沉函数运算实现多次调整

堆排序算法的复杂度低,和快速排序属于相同速度级别的一种快速的排序算法

下面以最小堆和最大堆来进行堆排序算法的实现,具体内容在代码中进行讲解


1.最小堆 堆排序

#include"iostream"
#include"cstdio"


using namespace std;


int h[100];               //堆
int n;
int num;            //num的意义在于,在n的值不断减小的时候,保存n原来的值,以便我们在最后输出排序后的数组的时候,丢失原来的数组元素个数的值


void swap(int x,int y)                       //必要的交换函数
{
int t;
t=h[x];
h[x]=h[y];
h[y]=t;
}


void siftdown(int i)                          //子树的向下调整,构建局部最小堆
{
int t,flag=0;
while(i*2<=n&&flag==0)
{
if(h[i]>h[i*2])
{
t=2*i;
}
else
{
t=i;
}
if(i*2+1<=n)
{
if(h[t]>h[2*i+1])
{
t=2*i+1;
}
}
if(t!=i)
{
swap(t,i);
i=t;
}
else
{
flag=1;
}

}


/*void siftup(int i)
{
int flag=0;
if(i==1)
{
return ;
}
else
{
while(i!=1&&flag==0)
{
if(h[i]<h[i/2])
{
swap(i,i/2);
i=i/2;
}
else
{
flag=1;
}
}
}
}*/


int delet()                             //每次返回对顶元素,堆顶元素出堆的顺序是排序好的
{
int t;
t=h[1];
h[1]=h[n];                   //交换的目的是和下面的n--和siftdown共同保证每次出堆的是标准的要求的顺序
n--;
siftdown(1);
return t;
}


int main()
{
cin>>n;
num=n;
for(int i=1;i<=n;i++)
{
scanf("%d",&h[i]);
}
for(int i=n/2;i>=1;i--)
{
siftdown(i);
}
for(int i=1;i<=num;i++)
{
printf("%d ",delet());
}
return 0;



2.最大堆  堆排序


#include"iostream"
#include"cstdio"


using namespace std;


int h[100];
int n;
int num;


void swap(int x,int y)
{
int t;
t=h[x];
h[x]=h[y];
h[y]=t;
}

  
void siftdown(int i)                            //构建最大数的siftdown下沉函数
{
int t,flag=0;
while(i*2<=n&&flag==0)
{
if(h[i]<h[i*2])
{
t=2*i;
}
else
{
t=i;
}
if(i*2+1<=n)
{
if(h[t]<h[i*2+1])
{
t=2*i+1;
}
}
if(t!=i)
{
swap(t,i);
i=t;

else
{
flag=1;
}
}
}


void heapsort()                        //heapsort堆排序函数
{
while(n>1)
{
swap(1,n);
n--;                                           //这三句的目的是将最大的元素不断从堆顶有序的排列到堆尾,以便最后进行整体输出
siftdown(1);
}
}


int main()
{
cin>>n;
num=n;
for(int i=1;i<=n;i++)
{
scanf("%d",&h[i]);
}
for(int i=n/2;i>=1;i--)
{
siftdown(i);
}
heapsort();
for(int i=1;i<=num;i++)
{
printf("%d ",h[i]);
}
return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
堆排序是一种常见的排序算法,其中使用最小堆来进行排序。下面是使用C++实现的数组堆排序最小堆代码: ```cpp #include <iostream> using namespace std; // 交换两个元素的值 void swap(int* a, int* b) { int temp = *a; *a = *b; *b = temp; } // 调整最小堆 void heapify(int arr[], int n, int i) { int smallest = i; // 初始化最小值为根节点 int left = 2 * i + 1; // 左子节点 int right = 2 * i + 2; // 右子节点 // 如果左子节点小于根节点,则更新最小值 if (left < n && arr[left] < arr[smallest]) smallest = left; // 如果右子节点小于根节点,则更新最小值 if (right < n && arr[right] < arr[smallest]) smallest = right; // 如果最小值不是根节点,则交换根节点和最小值,并递归调整最小堆 if (smallest != i) { swap(&arr[i], &arr[smallest]); heapify(arr, n, smallest); } } // 堆排序函数 void heapSort(int arr[], int n) { // 构建最小堆(从最后一个非叶子节点开始) for (int i = n / 2 - 1; i >= 0; i--) heapify(arr, n, i); // 逐个从堆中取出元素,并重新构建最小堆 for (int i = n - 1; i >= 0; i--) { swap(&arr[0], &arr[i]); // 将当前根节点(最小值)与最后一个元素交换 heapify(arr, i, 0); // 重新构建最小堆 } } // 打印数组 void printArray(int arr[], int n) { for (int i = 0; i < n; ++i) cout << arr[i] << " "; cout << endl; } int main() { int arr[] = { 12, 11, 13, 5, 6, 7 }; int n = sizeof(arr) / sizeof(arr[0]); cout << "原始数组: "; printArray(arr, n); heapSort(arr, n); cout << "排序后的数组: "; printArray(arr, n); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值