数据结构与算法——c++8种排序算法集合

排序算法,结合大话数据结构使用更佳
不稳定的排序:希尔,堆,快排

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
class Sort{
	public:
	//1. 冒泡排序法 
	void Bubble(vector<int> &a)
	{
		int len = a.size();
		for(int i = 0; i < len; ++i)
		{
			for(int j = len-1; j > i; --j)
			{
				if(a[j]<a[i])
					swap(a[j],a[i]);
			}
		}
	}
	//2. 选择排序法
	void Select(vector<int> &a)
	{
		int len = a.size();
		for(int i = 0; i < len; ++i)
		{
			int loc = i;
			for(int j = i+1; j < len; ++j)
			{
				if(a[loc]>a[j])
					loc = j;
			}
			if(loc != i)
				swap(a[loc],a[i]);
		}
		
	 } 
	 //3. 直接插入排序
	void InsertSort(vector<int> &a)
	{
		int len = a.size();
		int temp = a[0];
		for(int i = 1; i < len; ++i)
		{
			//如果后面有一张牌比前面的牌小 
			if(a[i]<a[i-1])
			{
				temp = a[i];
				int j; 
				
				for(j = i-1; j >= 0&& a[j]>temp; j--)
				{
					//牌后移 
					a[j+1] = a[j];
				}
				a[j+1] = temp;
			}
		}
	} 
	//4. 希尔排序法
	void Shell(vector<int> &a)
	{
		int len = a.size();
		int gap = len/3;
		do{
			gap = gap / 3 + 1;
			for(int i = gap; i < len; ++i)
			{
				if(a[i]<a[i-gap])
				{
					int j;
					int temp = a[i];
					for( j = i - gap; j >= 0 && a[j] > temp; j -= gap)
						a[j+gap] = a[j];
					a[j+gap] = temp; 
				}
			}
			
		}while(gap>1); 
	 } 
	 //5. 堆排序
	void HeapSort(vector<int> &a)
	{
		int len = a.size();
		for(int i = len/2-1; i >= 0; i--)
			HeapAdjust(a,i,len);
		for(int i = len-1; i>0; i--)
		{
			swap(a[0],a[i]);
			HeapAdjust(a,0,i);
		}
	}
	void HeapAdjust(vector<int>&a, int begin, int len)
	{
		int temp = a[begin];
		for(int i = 2 * begin + 1; i<len; i++)
		{
			if(i<len-1&&a[i]<a[i+1])
				i++;
			if(a[i]<temp)
				break;
			a[begin] = a[i];
			begin = i;
		}
		a[begin] = temp;
	}
	//6. 归并排序
	void MergeSort(vector<int>&a)
	{
		int len = a.size();
		vector<int> temp(len,0);
		MergeSplit(a,temp,0,len-1);
	}
	void MergeSplit(vector<int> &a,vector<int> &temp,int begin,int end) 
	{
		if(begin>=end)
			return;
		int mid = (begin + end) / 2;
		MergeSplit(a,temp,begin,mid);
		MergeSplit(a,temp,mid+1,end);
		Merge(a,temp,begin,end,mid);
	}
	void Merge(vector<int>&a,vector<int> &temp,int begin,int end, int mid)
	{
		int k = 0, i = begin, j = mid +1;
		while(i <= mid && j <= end)
		{
			if(a[i] < a[j])
			{
				temp[k] = a[i];
				i++;
			}
			else
			{
				temp[k] = a[j];
				j++;
			 } 
			k++; 
		}
		while(i<=mid)
			temp[k++] = a[i++];
		while(j <= end)
			temp[k++] = a[j++];
		for(int i = begin, k = 0; i <= end; i++,k++ )
		{
			a[i] = temp[k];
		 } 
		
	}
	//7. 快速排序
	void Qsort(vector<int> &a)
	{
		int len = a.size();
		quickly(a,0,len-1);
	} 
	void quickly(vector<int> &a,int begin,int end)
	{
		if(begin>end)
			return;
		int loc = Partition(a,begin,end);
		quickly(a,begin,loc-1);
		quickly(a,loc+1,end);
	}
	int Partition(vector<int> &a,int begin,int end)
	{
		int temp = a[begin];
		while(begin<end)
		{
			while(begin<end&&temp <= a[end])
				end--;
			if(begin<end)
				swap(a[begin],a[end]);
			while(begin<end&&temp >= a[begin])
				begin++;
			if(begin<end)
				swap(a[begin],a[end]);
		}
		return begin;
		
	 } 
	void print(vector<int> a)
	{
		for(int i = 0; i < a.size(); ++i)
		{
			cout<<a[i]<<" ";
		}
		cout<<endl;
	 } 
	vector<int> insert(int a[],int sz)
	{
		vector<int> res;
		for(int i = 0; i < sz; ++i)
			res.push_back(a[i]) ;
		return res;
	}
}; 
int main()
{
	Sort s; 
	int a[9] = {3,5,6,2,7,4,1,0,8};
	int sz = sizeof(a) / sizeof(int);
	vector<int> input = s.insert(a,sz);
	s.MergeSort(input);
	s.print(input);
	
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值