六种排序算法的实现(c++)

#include<iostream>
#include<ctime>
#include<cstring>
using namespace std;
const int N = 1e5+10;
int n;
int a[N];
int tmp[N];//归并排序的辅助数组 

void insert_sort() //插入排序 
{
	for(int i = 2;i <= n;i++)
	{
		int key = a[i];
		int j = i;
		while(j > 1 && a[j-1] > key)
		{
			a[j] = a[j-1];
			j--;
		}
		a[j] = key;
	}
}

void select_sort() //选择排序 
{
	for(int i = 1;i <= n;i++)//i为未排序序列的第一个 
	{
		int minj = i,minnum = a[i];
		for(int j = i+1;j <= n;j++)
		{
			if(a[j] < minnum)
			{
				minj = j;
				minnum = a[minj];
			}
		}
		swap(a[minj],a[i]);
	}
}

void bubble_sort() //冒泡排序 
{
	for(int i = 1;i < n;i++)
	{
		bool flag = true; //优化 
		for(int j = 1;j <= n-i;j++)
		{
			if(a[j] > a[j+1]) 
			{
				swap(a[j],a[j+1]);
				flag = false;
			}
		}
		if(flag) break;
	}
}

void down(int parent,int len) //向下调整算法 
{
	int child = 2*parent;
	while(child <= len)
	{
		if(child+1 <= len && a[child] < a[child+1]) child++;
		if(a[parent] > a[child]) return;
		swap(a[parent],a[child]);
		parent = child;
		child = 2*parent;
	}
}
void heap_sort() //堆排序 
{
	//建堆 
	for(int i = n/2;i >= 1;i--)//从第一个非叶子节点开始执行向下调整 
	{
		down(i,n);
	}
	//排序 
	for(int i = n;i > 1;i--)
	{
		swap(a[i],a[1]);
		down(1,i-1);
	}
	
} 

int get_random(int left,int right)//快排优化1:随机获取一个基准元素 
{
	return a[rand()%(right-left+1) + left];
} 
void quick_sort(int left,int right) //快速排序 
{
	if(left >= right) return;
	int key = get_random(left,right);
	int l = left-1,r = right+1,i = left;
	while(i < r) //优化2:三路划分 
	{
		if(a[i] < key)//放左边
		{
			l++;
			swap(a[l],a[i]);
			i++;
		} 
		else if(a[i] == key) i++;
		else
		{
			r--;
			swap(a[r],a[i]);
		}
	}
	//[left,l] [r,right]
	quick_sort(left,l);
	quick_sort(r,right);
}

void merge_sort(int left,int right) //归并排序 
{
	if(left >= right) return;
	int mid = (left+right) >> 1;
	merge_sort(left,mid);
	merge_sort(mid+1,right);
	int cur1 = left,cur2 = mid+1,cur = left;
	while(cur1 <= mid && cur2 <= right)
	{
		if(a[cur1] < a[cur2]) tmp[cur++] = a[cur1++];
		else tmp[cur++] = a[cur2++];
	}
	while(cur1 <= mid) tmp[cur++] = a[cur1++];
	while(cur2 <= right) tmp[cur++] = a[cur2++];
	for(int i = left;i <= right;i++) a[i] = tmp[i];
}
int main()
{
	srand(time(0));
	cin >> n;
	for(int i = 1;i <= n;i++) cin >> a[i];
	merge_sort(1,n);
	for(int i = 1;i <= n;i++) cout << a[i] << " ";
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值