// test20.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
#include<vector>
#include<string>
#include<queue>
#include<stack>
#include<cstring>
#include<string.h>
#include<deque>
#include <forward_list>
using namespace std;
class Solution {
public:
//一般选择排序
void SelectSort(vector<int> &vec)
{
for (int i = 0;i < vec.size();++i)
{
int min_lable= i; //记录下最小值对应的编号
for (int j = i+1;j < vec.size();++j)
{
if (vec[min_lable] > vec[j])
{
min_lable = j;
}
}
if (min_lable != i)
{
int temp = vec[i];
vec[i] = vec[min_lable];
vec[min_lable] = temp;
}
}
print(vec);
}
//堆排序
//调整堆
void HeapAdjust(vector<int> &vec,int h,int m)//h为堆头,m为总的元素数量h+1...m已经是堆
{
int lable = h;
//cout << "原来的head:" <<vec[lable] << endl;
for (int i = (h + 1) * 2 - 1;i < m;i = (i + 1) * 2 - 1) //(h+1)*2-1对应h的左孩子,(h+1)*2对应节点的右孩子
{
if (i + 1 < m)//判断右孩子是否存在
{
if (vec[i] < vec[i + 1]) i=i+1;//右孩子比较大
}
if (vec[lable] > vec[i])
{
break;
}//头节点的值比两个孩子都大,则已经是堆,break;
else //与最大的孩子交换值
{
int temp = vec[lable];
vec[lable] = vec[i];
vec[i] = temp;
lable = i;//注意更新lable,之前就是因为这一块的问题总是出现问题!!!!!!!!!!!!
} //交换完成之后继续向下判断
}
}
//除建立堆
//所有叶子节点都是堆,所以建立堆的时候应该是从size/2-1的节点开始处建立堆
void CreatHeap(vector<int> &vec)
{
int size = vec.size();
for (int i = size / 2 - 1;i >= 0;--i)
{
HeapAdjust(vec,i,size);//反复调用HeadAdjust来调整堆
cout << "第" << i << "遍历:";
print(vec);
}
cout << "第最后的排序:";
print(vec);
}
//堆排序
void HeapSort(vector<int> &vec)
{
//先建堆
//每次选择堆中最大的值与最后一个节点交换
//再调整堆
CreatHeap(vec);
for (int i = vec.size() - 1;i > 0;--i)
{
int temp = vec[0];
vec[0] = vec[i];
vec[i] = temp; //每次和vec数组后面的值交换
HeapAdjust(vec,0,i);//调整前i个元素为堆
}
print(vec);
}
void print(vector<int> &vec)//打印数据
{
for (auto it = vec.begin();it != vec.end();++it)
{
cout << *it << " ";
}
cout << endl;
}
};
int main()
{
vector<int> vec = { 49,38,65,97,76,13,27,49};
// vector<int> vec = {7,6,5,4,3,2,1 };
// vector<int> vec = { 0,1,2,3,4,5,6,7 };
// vector<int> vec = { 0,1,6,7,4,5,2,3};
Solution so;
//原来的序列
cout << "原来的序列: ";
so.print(vec);
/*cout << "选择排序后的的序列: ";
so.SelectSort(vec);*/
//cout << "大堆顶的序列为:" << endl;
//so.CreatHeap(vec);
cout << "堆排序:" << endl;
so.HeapSort(vec);
return 0;
}