堆排序
2016-03-17 10:50
267 查看
算法导论:堆排序实现
#include<iostream>
#include<vector>
using namespace std;
//维持堆父节点最大性质
void max_heapify(vector<int>&A, int i,int heap_size)
{
int l = 2 * i;
int r = 2 * i + 1;
int largest = -1;
if (l <= heap_size && A[l - 1] > A[i - 1])
{
largest = l;
}
else
{
largest = i;
}
if (r <= heap_size && A[r - 1] > A[largest - 1])
{
largest = r;
}
if (largest != i)
{
int temp = A[i - 1];
A[i - 1] = A[largest - 1];
A[largest - 1] = temp;
max_heapify(A, largest,heap_size);
}
}
//构造堆
void build_max_heap(vector<int>&A,int heap_size)
{
for (int i = heap_size / 2; i >= 1; --i)
{
max_heapify(A, i,heap_size);
}
}
//堆排序
void heapsort(vector<int>&A)
{
int heap_size = A.size();
build_max_heap(A,heap_size);
cout << endl;
for (int i = heap_size - 1; i >= 1;--i)
{
int temp = A[0];
A[0] = A[i];
A[i] = temp;
heap_size = heap_size - 1;
max_heapify(A, 1,heap_size);
}
}
int main()
{
vector<int>A;
int n;
while (cin >> n)
{
A.push_back(n);
}
heapsort(A);
for (int i = 0; i < A.size(); ++i)
{
cout << A[i] << ends;
}
cout << endl;
return 0;
}
#include<iostream>
#include<vector>
using namespace std;
//维持堆父节点最大性质
void max_heapify(vector<int>&A, int i,int heap_size)
{
int l = 2 * i;
int r = 2 * i + 1;
int largest = -1;
if (l <= heap_size && A[l - 1] > A[i - 1])
{
largest = l;
}
else
{
largest = i;
}
if (r <= heap_size && A[r - 1] > A[largest - 1])
{
largest = r;
}
if (largest != i)
{
int temp = A[i - 1];
A[i - 1] = A[largest - 1];
A[largest - 1] = temp;
max_heapify(A, largest,heap_size);
}
}
//构造堆
void build_max_heap(vector<int>&A,int heap_size)
{
for (int i = heap_size / 2; i >= 1; --i)
{
max_heapify(A, i,heap_size);
}
}
//堆排序
void heapsort(vector<int>&A)
{
int heap_size = A.size();
build_max_heap(A,heap_size);
cout << endl;
for (int i = heap_size - 1; i >= 1;--i)
{
int temp = A[0];
A[0] = A[i];
A[i] = temp;
heap_size = heap_size - 1;
max_heapify(A, 1,heap_size);
}
}
int main()
{
vector<int>A;
int n;
while (cin >> n)
{
A.push_back(n);
}
heapsort(A);
for (int i = 0; i < A.size(); ++i)
{
cout << A[i] << ends;
}
cout << endl;
return 0;
}
相关文章推荐
- java算法导论之FloydWarshall算法实现代码
- MIT Introduction to Algorithms 学习笔记(一)
- MIT Introduction to Algorithms 学习笔记(二)
- MIT Introduction to Algorithms 学习笔记(三)
- MIT Introduction to Algorithms 学习笔记(四)
- MIT Introduction to Algorithms 学习笔记(五)
- MIT Introduction to Algorithms 学习笔记(六)
- MIT Introduction to Algorithms 学习笔记(七)
- MIT Introduction to Algorithms 学习笔记(八)
- MIT Introduction to Algorithms 学习笔记(九)
- MIT Introduction to Algorithms 学习笔记(十)
- 堆排序/优先级队列
- Red-Black Tree 的Java实现
- 逆序对
- 算法导论之堆
- LCS 最长公共子序列
- 使用Java完成《算法导论》习题2.2-2
- 使用Java完成《算法导论》习题2.3-2
- 使用Java完成《算法导论》习题2.3-4
- 使用Java完成《算法导论》习题2.3-5