堆排序,下标从1开始,结果错误,修改为下标从0开始后运行正常,但不知道问题在哪里。
#include
using namespace std;
void maxheap(int* a, int i, int size);
void buildheap(int* a, int n);
void heapsort(int n, int* a);
int main()
{
int size;
cout << "请先输入你想排序的数组的长度,按下enter后,再逐一输入数组元素" << endl;
int a[100];
cin >> size;
for (int i = 1; i <= size; i++)
cin >> a[i];
heapsort(size, a);
for (int i = 1; i <= size; i++)
cout << a[i] << " ";
return 0;
}
void maxheap(int* a, int i, int size)
{
int largest = i;
int l = 2 * i;
int r = 2 * i + 1;
if (l <= size && a[l] > a[largest])
largest = l;
if (r <= size && a[r] > a[largest])
largest = r;
if (largest != i)
{
swap(a[i], a[largest]);
maxheap(a, largest, size);
}
}
void buildheap(int* a, int size)
{
for (int i = size / 2; i >= 1; i--)
{
maxheap(a, i, size);
}
}
void heapsort(int size, int* a)
{
buildheap(a, size);
for (int i = size; i >= 2; i--)
{
swap(a[i], a[1]);
maxheap(a, 1, i);
}
}
//10
//16 14 10 8 7 9 3 2 4 1
因为数组下标就是从0开始的
堆要利用二叉树的数组储存的特性,保证左孩子和右孩子符合特性,下标就必须从1开始,你的代码中循环从1开始,调整一下就行。
在堆排序中,数组下标从0开始是比较常见的,这是因为计算机程序中数组下标通常是从0开始的。而您的代码中,数组下标是从1开始的,因此在计算下标时会出现错误,导致排序不正确。
修改为下标从0开始后,您需要对代码进行一些修改:
在for循环中输入数组元素时,从a[0]开始输入
在maxheap函数中,l和r的初始化要分别改为2 * i + 1和2 * i + 2
在buildheap函数中,从size / 2 - 1开始循环
在heapsort函数中,从size - 1开始循环
修改后的代码如下:
#include<bits/stdc++.h>
using namespace std;
void maxheap(int* a, int i, int size);
void buildheap(int* a, int n);
void heapsort(int n, int* a);
int main()
{
int size;
cout << "请先输入你想排序的数组的长度,按下enter后,再逐一输入数组元素" << endl;
int a[100];
cin >> size;
for (int i = 0; i < size; i++)
cin >> a[i];
heapsort(size, a);
for (int i = 0; i < size; i++)
cout << a[i] << " ";
return 0;
}
void maxheap(int* a, int i, int size)
{
int largest = i;
int l = 2 * i + 1;
int r = 2 * i + 2;
if (l < size && a[l] > a[largest])
largest = l;
if (r < size && a[r] > a[largest])
largest = r;
if (largest != i)
{
swap(a[i], a[largest]);
max