排序算法

冒泡排序,稳定,复杂度n*n

选择排序,不稳定,复杂度n*n

不稳定:

快速排序,递归实现,不稳定,复杂度n*log(n),空间复杂度

堆排序,大小顶堆实现,不稳定,复杂度n*log(n)

稳定:

在快速排序中添加另外一个控制变量

合并排序,两个有序队列合并


1、快速排序示例

//快速排序示例
#include <cstdio>
#include <cstdlib>
int p[50];
int len;
void input()
{
	len = 20;
	int i;
	for(i = 0; i < len; ++ i)
		p[i] = rand() / 100;
	p[0] = p[1] = p[2] = 50;
}

void print()
{
	int i;
	for(i = 0; i < len; ++ i)
		printf("%d ", p[i]);
	printf("\n");
}

void fsort(int l, int r)//快速排序
{
	if(l >= r) 
		return;
	int temp = p[l];
	int pl, pr;
	for(pl = l, pr = r;pl < pr;)
	{
		for(;pl < pr;)
		{
			if(p[pr] >= temp)
				pr --;
			else
				break;
		}
		if(pl < pr) p[pl ++] = p[pr];
		for(;pl < pr;)
		{
			if(p[pl] <= temp)
				pl ++;
			else
				break;
		}
		if(pl < pr) p[pr --] = p[pl];
	}
	p[pr] = temp;
	fsort(l, pr - 1);
	fsort(pr + 1, r);
}

int main()
{
	input();
	print();
	fsort(0, len - 1);
	print();
	return 0;
}

2、堆排序示例

//堆排序示例
#include <cstdio>
#include <cstdlib>
int p[50];
int len;
void input()
{
	len = 25;
	int i;
	for(i = 1; i <= len; ++ i)
		p[i] = rand() / 100;
	p[1] = p[2] = 50;
}

void print()
{
	int i;
	for(i = 1; i <= len; ++ i)
		printf("%d ", p[i]);
	printf("\n");
}

void swap(int x, int y)
{
	int temp = p[x];
	p[x] = p[y];
	p[y] = temp;
}

void fsort()//堆排序
{
	int i;
	int q;
	for(i = len / 2; i >= 1; -- i)//小顶堆初始化
	{
		q = i;
		while(2 * q <= len)
		{
			if(2 * q + 1 > len)
			{
				if(p[q] > p[2 * q])
				{
					swap(q, 2 * q);
					q = 2 * q;
				}
				break;
			}
			else
			{
				if(p[2 * q] <= p[2 * q + 1])
				{
					if(p[q] > p[2 * q])
					{
						swap(q, 2 * q);
						q = 2 * q;
					}
					else
						break;
				}
				else
				{
					if(p[q] > p[2 * q + 1])
					{
						swap(q, 2 * q + 1);
						q = 2 * q + 1;
					}
					else
						break;
				}
			}
		}
	}
	int n = 1;
	while(n < len)//每次第一个数与最后一位数交换,这样循环len - 1遍,数组从大到小排序
	{
		swap(len - n + 1, 1);
		q = 1;
		while(2 * q < len - n + 1)
		{
			if(2 * q + 1 >= len - n + 1)
			{
				if(p[q] > p[2 * q])
				{
					swap(q, 2 * q);
					q = 2 * q;
				}
				else
					break;
			}
			else
			{
				if(p[2 * q] <= p[2 * q + 1])
				{
					if(p[q] > p[2 * q])
					{
						swap(q, 2 * q);
						q = 2 * q;
					}
					else
						break;
				}
				else
				{
					if(p[q] > p[2 * q + 1])
					{
						swap(q, 2 * q + 1);
						q = 2 * q + 1;
					}
					else
						break;
				}
			}
		}
		n ++;
	}

}

int main()
{
	input();
	print();
	fsort();
	print();
	return 0;
}

3、归并排序

//归并排序示例
#include <cstdio>
#include <cstdlib>
#include <cstring>
int p[50];
int _p[50];
int len;
void input()
{
	len = 20;
	int i;
	for(i = 0; i < len; ++ i)
		_p[i] = p[i] = rand() / 100;
	_p[0] = p[0] = 50;
	_p[1] = p[1] = 50;
	_p[2] = p[2] = 50;
}

void print()
{
	int i;
	for(i = 0; i < len; ++ i)
		printf("%d ", p[i]);
	printf("\n");
}

void fsort(int l, int r)//归并排序
{
	if(l == r)
		return;
	int mid = (l + r) / 2;
	fsort(l, mid);
	fsort(mid + 1, r);
	int i, j, z;
	for(i = l, j = mid + 1, z = 0; i <= mid || j <= r;)//对两个有序数组进行排序
	{
		if(i > mid)
			_p[l + (z ++)] = p[j ++];
		else if(j > r)
			_p[l + (z ++)] = p[i ++];
		else
		{
			if(p[i] <= p[j])
				_p[l + (z ++)] = p[i ++];
			else
				_p[l + (z ++)] = p[j ++];
		}
	}
	//memcpy(p, _p, sizeof(_p));
	for(i = l; i <= r; ++ i)
		p[i] = _p[i];
}

int main()
{
	input();
	print();
	fsort(0, len - 1);
	print();
	return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值