选择排序——一般选择排序,堆排序

// 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;
}
posted @ 2016-11-12 19:07  wdan2016  阅读(219)  评论(0编辑  收藏  举报