最常用的几大排序汇总

目录

前言

一、常见的排序方法

二、插入排序

1.插入排序的思想

2、直接插入排序

2.1直接插入排序的实现

2.2插入排序特点 

3、希尔排序

3.1希尔排序介绍

 3.2希尔排序实现

三、选择排序 

1、基本思想

2、直接选择排序

 3、堆排序

四、交换排序

1、冒泡排序

2、快速排序

2.1快速排序单趟排序的实现方法

2.2快速排序优化

2.3快递排序的非递归写法

五、归并排序

1、归并排序概念

2、归并排序的递归实现 

3、归并排序的非递归实现

 六、非比较排序

七、排序算法复杂度和稳定性分析 

总结


前言

哈喽,小伙伴们大家好。排序一直是算法中的一个重要内容,对于计算机初学者有一定的挑战。相信很多刚刚接触排序的小伙伴除了冒泡排序掌握的非常熟练之外,对其它的排序方法都是一知半解(反正我刚开始学的是这样hhh)。那么今天我将把几种常用的排序进行汇总,对原理以及实现方法进行讲解,希望能给大家带来帮助。


一、常见的排序方法

排序概念:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。

常见的排序方法:

二、插入排序

1.插入排序的思想

相信大家都应该玩过扑克牌吧,在我们玩斗地主的时候,为了方便看牌,常常会一边摸牌一边把牌按大小顺序排列起来,在这个过程中其实就用到了插入排序的思想。我们不妨一起回忆一下平常在摸牌的时候是怎样进行排序的。

首先,我们摸了一张5放到手里。然后又摸到了一张7,用7和5去比较,7比5大所以我们把它放到了5的右边。然后又摸到了一张6,6和7比较,6比7小,6继续和5比较,6比5大,放到5的右边……在这之后我们每摸一张牌都和手中原来的牌从右向左依次比较,直到找到比摸到的牌小的牌,然后把摸到的牌插入到它的右边,这个过程就是插入排序的思想。

2、直接插入排序

2.1直接插入排序的实现

按照我们上面描述的思想,我们可以进行实现,代码如下:

insert_sort(int* a, int n)
{
	for (int i = 0; i < n - 1; i++)
	{
		//[0,end]有序,把a[end+1]插入进去
		int end = i;
		int temp = a[end + 1];
		while (end >= 0)
		{
			if (a[end]>temp)
			{
				a[end + 1] = a[end];
				end--;
			}
			else
			{
				break;
			}
		}
		a[end + 1] = temp;
	}
}

2.2插入排序特点 

  • 时间复杂度为O(N^2)
  • 元素集合越接近有序,插入排序时间效率越高。在有序的情况下时间复杂度为O(N)
  • 空间复杂度:O(1)

3、希尔排序

3.1希尔排序介绍

简介:希尔排序是对直接插入排序的优化。通过上面的介绍我们知道,在越接近有序的情况下,插入排序的效率越高。既然如此,就有人想到,在进行排序之前,能不能先进行一下预排序,使元素集合处在接近有序的状态来提高效率呢?于是希尔排序就诞生了。

思想:希尔排序又称缩小增量法,基本思想是把一个元素集合分为gap组,每个组之间元素的距离为gap,然后分别对几个组进行排序。排序完成后再缩小gap,再重新分组进行排序,重复此过程。直到gap为1,预排序完成,再进行最后的插入排序。

 3.2希尔排序实现

代码如下:

shell_sort(int* a,int n)
{
	int gap = n;
	while (gap > 1)
	{
		gap = gap / 3 + 1;//保证最后一次gap是1
		for (int i = 0; i < n - gap; i++)
		{
			int end = i;
			int temp = a[end + gap];
			while (end >= 0)
			{
				if (a[end] > temp)
				{
					a[end + gap] = a[end];
					end -= gap;
				}

				else
				{
					break;
				}
			}
			a[end + gap] = temp;
		}
	}
}

希尔排序的特性总结:

  • 希尔排序是对直接插入排序的优化。
  • 当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。
  • 希尔排序的时间复杂度不好计算,因为gap的取值方法很多,导致很难去计算,我们可以参考一下书中给出的。

三、选择排序 

1、基本思想

选择排序的思想非常简单粗暴,即每次从要排序的集合中选出一个最大或最小的数放在序列起始位置,重复此操作,直到序列中的全部元素被排完。

2、直接选择排序

根据选择排序的原理,我们不难把代码实现出来。

void select_sort(int* a, int n)
{
	int begin = 0;
	int end = n - 1;
	//最小的放到队头,最大的放到队末
	while (begin < end)
	{
		int max = begin, min = begin;
		for (int i = begin; i
  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
排序算法中,时间复杂度是评估算法性能的重要指标。根据引用和引用的内容,下面是一些常见排序算法的时间复杂度汇总: 1. 冒泡排序:冒泡排序是一种简单但效率较低的排序算法。最坏情况下,冒泡排序的时间复杂度是O(n^2),其中n是待排序元素的数量。最好情况下,当数据已经有序时,冒泡排序的时间复杂度是O(n)。 2. 插入排序:插入排序算法根据待排序序列中的元素逐个插入已排序序列的合适位置。最坏情况下,插入排序的时间复杂度也是O(n^2)。最好情况下,当数据已经有序时,插入排序的时间复杂度是O(n)。 3. 选择排序:选择排序是一种简单的排序算法,每次从未排序的部分选择最小(或最大)的元素,然后放到已排序部分的末尾。选择排序的时间复杂度始终为O(n^2),无论数据是否有序。 4. 快速排序:快速排序是一种高效的排序算法,基于分治的思想。最坏情况下,快速排序的时间复杂度是O(n^2),但通常情况下,快速排序的平均时间复杂度是O(nlogn)。 5. 归并排序:归并排序是一种稳定且高效的排序算法,基于分治和合并的思想。归并排序的时间复杂度始终为O(nlogn),无论数据是否有序。 综上所述,不同的排序算法其时间复杂度不同。冒泡排序和插入排序的时间复杂度是O(n^2),选择排序的时间复杂度也是O(n^2),而快速排序和归并排序的时间复杂度是O(nlogn)。请注意,这些时间复杂度都是在最坏情况下估计的。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值