zoukankan      html  css  js  c++  java
  • 选择排序——一般选择排序,堆排序

    // 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;
    }
  • 相关阅读:
    git gui 学习
    Java中关于 ArrayList 和 Map 的常用遍历方法 (学习笔记,便于以后查询)
    关于对 NUMA 理解(学习笔记,便于以后查阅)
    Java判断数据库表是否存在的方法
    流程开发Activiti 与SpringMVC整合实例
    shiro权限管理框架与springmvc整合
    Java开发中的23种设计模式详解(转)
    JMS学习之路(一):整合activeMQ到SpringMVC
    SpringMVC中定时任务配置
    RPC远程过程调用学习之路(一):用最原始代码还原PRC框架
  • 原文地址:https://www.cnblogs.com/wdan2016/p/6057348.html
Copyright © 2011-2022 走看看