刚刚看的堆排序.写得好纠结
#include <iostream>
#include <cstdlib>
#include <random>
using namespace std;
//堆排序
void heap_sort(int data [], size_t n);
//重拍数排使其成为一个堆(向上重排)
void make_heap(int data [], size_t n);
//向下重排
void reheapify_down(int data [], size_t n);
//交换数据
void swapdata(int& a, int& b);
//打印数组
void show(int data [], size_t n);
int main()
{
int data [] = { 1, 6, 9, 10, 5, 8, 9,8,7,9,7,3,3,3,5,6,7,8,100};
heap_sort(data, sizeof(data) / sizeof(data[0]));
return 0;
}
void heap_sort(int data [], size_t n)
{
size_t unsorted = n;
make_heap(data, n);
show(data, n);
while (unsorted > 1)
{
--unsorted;
swapdata(data[0], data[unsorted]);
show(data, n);
reheapify_down(data, unsorted);
show(data, n);
cout << endl;
}
}
//重拍数排使其成为一个堆(向上重排)
void make_heap(int data [], size_t n)
{
size_t i;
for (i = 1; i < n; i++)
{
while (i>0)
{
if (data[i] > data[(i - 1) / 2])
{
swapdata(data[i], data[(i - 1) / 2]);
i = (i - 1) / 2;
}
else
break;
}
}
}
//向下重排
void reheapify_down(int data [], size_t n)
{
size_t i = 0;
while (2 * i + 2 < n)
{
int k = 2*i + 1;
if (k+1 <= n && (data[k] < data[k+1]))
k++;
if (data[i] > data[k])
break;
swap(data[i], data[k]);
i = k;
}
while (n == 2)
{
if (data[0] < data[1])
swapdata(data[0], data[1]);
else
break;
}
}
//交换数据
void swapdata(int& a, int& b)
{
int temp = a;
a = b;
b = temp;
}
//打印数组
void show(int data [], size_t n)
{
size_t i;
for (i = 0; i < n; i++)
cout << data[i] << ", " ;
cout << endl;
}