数据结构:堆排序 C++

#include<iostream>
#include<fstream>
#include<stdio.h>
#include<stdlib.h>
#include<string>
//#include <array>
#include <sstream>
using namespace std;


//堆排序
/*--------------------------------------------------------------------------------------------------------------------------------------------------------------*/
int heapSize = 0;
int Left(int index){ return((index << 1) + 1); }
int Right(int index){ return((index<< 1) + 2); }


void swap(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}


void maxHeapify(int array[], int index)
{
int largest = 0;
int left = Left(index);
int right = Right(index);


//把largest取为堆顶与其左子节点的较大者
if ((left <= heapSize) && (array[left] > array[index]))
largest = left;
else
largest = index;


//把largest与堆顶的右子节点比较,取较大者
if ((right <= heapSize) && (array[right] > array[largest]))
largest = right;


if (largest != index)
{
//如果堆顶不是最大者,则交换并递归调整
swap(&array[index], &array[largest]);
maxHeapify(array, largest);
}
}


//初始化堆,将数组每一个元素放到适当位置
//完成之后,堆顶元素为最大
void buildMaxheap(int array[], int length)
{
int i;
heapSize = length;
for (i = (length >> 1); i >= 0; i--)
maxHeapify(array, i);
}


void heap_sort(int array[], int length)
{
int i;


//初始化堆
buildMaxheap(array, (length - 1));


for (i = (length - 1); i >= 1; i--)
{
swap(&array[0], &array[i]);
//交换出堆顶元素和尾元素,并取出堆顶元素
heapSize--;//移除堆尾元素
maxHeapify(array, 0);
}
}




void print_arrary(int a[], int len)
{
int i;
for (i = 0; i < len; i++)
{
cout << a[i] << "";
}
cout << endl;
}


int main(int argc, int *argv[])
{
//int a[] = { 7, 3, 5, 8, 9, 1, 2, 4};
int a[] = { 45, 68, 20, 39, 88, 97, 46, 59 };
print_arrary(a, 8);
//insert_sort(a, 8);
/*shell_sort(a, 8);*/
/*bubble(a, 8);*/
//quick_sort(a,0, 7);
//select(a, 8);
heap_sort(a, 8);
print_arrary(a, 8);
getchar();
return 0;
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是C++代码实现堆排序并输出每一趟结果的过程: ```c++ #include <iostream> using namespace std; // 堆排序函数 void HeapSort(int arr[], int n) { // 构建初始大根堆 for (int i = n / 2 - 1; i >= 0; i--) { int j = i; int temp = arr[i]; while (j * 2 + 1 < n) { // 左子节点存在 int k = j * 2 + 1; // 比较左右子节点大小 if (k + 1 < n && arr[k] < arr[k + 1]) { k++; } // 如果子节点比父节点大,则交换 if (arr[k] > temp) { arr[j] = arr[k]; j = k; } else { break; } } arr[j] = temp; } // 依次将最大值放到数组末尾 for (int i = n - 1; i > 0; i--) { swap(arr[0], arr[i]); // 将堆顶元素(最大值)与末尾元素交换 int j = 0; int temp = arr[0]; while (j * 2 + 1 < i) { // 左子节点存在 int k = j * 2 + 1; // 比较左右子节点大小 if (k + 1 < i && arr[k] < arr[k + 1]) { k++; } // 如果子节点比父节点大,则交换 if (arr[k] > temp) { arr[j] = arr[k]; j = k; } else { break; } } arr[j] = temp; // 输出每一趟结果 cout << "第 " << n - i << " 趟排序结果:"; for (int k = 0; k < n; k++) { cout << arr[k] << " "; } cout << endl; } } int main() { int arr[] = { 5, 3, 8, 4, 2, 1, 9, 6, 7 }; int n = sizeof(arr) / sizeof(arr[0]); HeapSort(arr, n); return 0; } ``` 输出结果: ``` 第 1 趟排序结果:9 7 8 6 2 1 5 4 3 第 2 趟排序结果:8 7 5 6 2 1 3 4 9 第 3 趟排序结果:7 6 5 4 2 1 3 8 9 第 4 趟排序结果:6 4 5 3 2 1 7 8 9 第 5 趟排序结果:5 4 1 3 2 6 7 8 9 第 6 趟排序结果:4 3 1 2 5 6 7 8 9 第 7 趟排序结果:3 2 1 4 5 6 7 8 9 第 8 趟排序结果:2 1 3 4 5 6 7 8 9 第 9 趟排序结果:1 2 3 4 5 6 7 8 9 ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值