1042: 堆排序
Description
已知堆排序的部分代码如下,勿改动,请补充实现堆排序函数void HeapSort(int n);。
#include<iostream>
using namespace std;
const int MaxSize=100;
class List
{
private:
int r[MaxSize+1];
int n;
public:
List(){n=0;} //empty list
void InsertR(int k) //表尾插入
{ r[++n]=k;}
void Display(); //display
void HeapSort() { HeapSort(n); } //HeapSort
void HeapSort(int n);
};
void List::Display()
{
for(int i=1;i<=n;i++)
cout<<r[i]<<" ";
cout<<"\n";
}
int main()
{
List L;
while(1)
{
int k;
cin>>k;
if(!k) break;
L.InsertR(k);
}
L.Display();
L.HeapSort();
L.Display();
return 0;
}
Input
Output
Sample Input
12 21 32 2 4 24 21 432 23 9 0
Sample Output
12 21 32 2 4 24 21 432 23 9
2 4 9 12 21 21 23 24 32 432
//
// Created by Legends丶Hu on 2020/2/8.
//
#include<iostream>
using namespace std;
const int MaxSize = 100;
class List {
private:
int r[MaxSize + 1];
int n;
public:
List() { n = 0; } //empty list
void InsertR(int k) //表尾插入
{ r[++n] = k; }
void Display(); //display
void HeapSort() { HeapSort(n); } //HeapSort
void HeapSort(int n);
};
void List::Display() {
for (int i = 1; i <= n; i++)
cout << r[i] << " ";
cout << "\n";
}
void Sift(int r[], int k, int m) {
int i = k, j = 2 * i;
while (j <= m) {
if (j < m && r[j] < r[j + 1])j++;
if (r[i] > r[j]) break;
else {
swap(r[i], r[j]);
i = j;
j = 2 * i;
}
}
}
void List::HeapSort(int n) {
for (int i = n >> 1; i >= 1; i--) {
Sift(r, i, n);
}
for (int i = 1; i < n; i++) {
swap(r[1], r[n - i + 1]);
Sift(r, 1, n - i);
}
}
//12 21 32 2 4 24 21 432 23 9 0
int main() {
List L;
while (1) {
int k;
cin >> k;
if (!k) break;
L.InsertR(k);
}
L.Display();
L.HeapSort();
L.Display();
return 0;
}