冒泡排序及快速排序

1.冒泡排序

原理:冒泡排序正如他的名字一样,大泡泡都会往上飘,把数组元素两两进行比较,按照大小一个一个往数组一侧移动
例:这有一个{5,2,3,1,4}的数组
在这里插入图片描述
首先5,2会相互比较,判定5>2 这个时候5就会跟2交换
在这里插入图片描述

接下来5会和3进行比较,以此类推,第一轮循环走完就会变成下图
在这里插入图片描述

后续的原理是一样的,经过lenth-1 轮后就排好序了
在这里插入图片描述
动图如下
在这里插入图片描述

冒泡排序的代码

void bubble_sort(int arr[], int lenth)
{
	int i,j,temp;
	for(i=0;i<lenth-1;i++)
	{
		for(j=0;j<lenth-1-i;j++)
		{
			if(a[j]>a[j+1])
			{
				temp = a[j+1];
				a[j+1] = a[j];
				a[j] = temp;
			}
		}
	}
}

冒泡排序虽然简单且稳定,但是所需要的循环次数多,时间复杂度太高了,对于一些有时间需求的排序来说,达不到需求。

2.快速排序

快速排序:主要是通过找一个中位数,通过这个中位数把数组分成两部分,左边比中位数小,右边比中位数大,在对这两部分进行同样的操作(即找中位数分成两部分)

快速排序通过取两个指针一左一右,来寻找那个中位数,通常我们取最左边的数
在这里插入图片描述
在这里插入图片描述
附上一个动图方便大家理解(这个动图取最右边元素作为标志数)
在这里插入图片描述
附上代码:

int partition(int arr[], int start, int end)
{
	int i = start;
	int j = end - 1;
	int flag_number = arr[i];
	while (i < j)
	{
		while (i<j && arr[j] >= flag_number)
		{
			j--;
		}
		arr[i] = arr[j];
		while (i < j && arr[i] <= flag_number)
		{
			i++;
		}
		arr[j] = arr[i];
	}
	arr[i] = flag_number;
	return i;
}

void quick_sort(int arr[], const int start, const int end)
{
	if (start < end - 1)
	{ /* 至少两个元素 */
		const int pivot_pos = partition(arr, start, end);
		quick_sort(arr, start, pivot_pos);
		quick_sort(arr, pivot_pos + 1, end);
	}
}


int main()
{
	int num[10] = { 5,2,3,6,1,4 };
	quick_sort(num, 0, 6);
	for (int i = 0; i < 6; i++)
		cout << num[i] << endl;
}

优点:平均性能好,速度快
缺点:不稳定,。

3.冒泡排序与快速的差别

(1)稳定性
快速排序不稳定
冒泡排序稳定
(2)时间复杂度
快速排序:时间复杂度为 O(nlogn),
冒泡排序:时间复杂度为 O(n2)
(3)效率
快速排序:复杂但是效率高,适用于多数据
冒泡排序:简单但效率低,适用于少量数据

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BigProgrambug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值