当前位置:   article > 正文

【初阶数据结构与算法】——手撕八大经典排序算法_手撕算法 排序

手撕算法 排序

这篇文章我们来学习排序。
在这里插入图片描述

1. 排序的概念及其运用

1.1 排序的概念

排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。
稳定性假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。
内部排序:数据元素全部放在内存中的排序。
外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。

1.2 排序的应用

其实在我们生活中,很多地方都要用到排序。
比如:

在这里插入图片描述
在这里插入图片描述

1.3 常见的排序算法

在这里插入图片描述
接下来,我们就来讲解并实现一下常见的排序算法。

2. 插入排序

2.1 直接插入排序

首先我们来学习直接插入排序:

算法思想

直接插入排序是一种简单的插入排序法,其基本思想是:

把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。

实际中我们玩扑克牌时,就用了插入排序的思想
在这里插入图片描述
在这里插入图片描述

举例(升序)

排序我们一般是对一个数组进行操作:

当插入第i(i>=1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好序,此时用array[i]的排序码与array[i-1],array[i-2],…的排序码顺序进行比较,找到插入位置即将array[i]插入,原来位置上的元素顺序后移

一趟直接插入排序:
在这里插入图片描述
所以一趟直接插入排序就是这样的:

end指向原有序数据的最后一个,那要插入的数据和end指向的数据进行对比,如果比end指向的数据大,那直接放在end后面,如果小,则把end指向的大的数据向后移动,end- - ,与前面的元素进行比较,直到遇到比要插入的元素小的数据,然后把要插入的数据放在其后面。
在这里插入图片描述
那如果前面的元素都比要插入的数据大呢?
那就一直比,直到比完第一个元素,然后end- -之后变成-1,还是放到end位置的后面,即让它成为新的第一个元素。

在这里插入图片描述

代码实现

那我们先来写一下一趟直接插入排序的代码:
在这里插入图片描述
这是一趟的,那现在有一个数组,我们如何使用直接插入排序对其进行排序呢?

我们是不是可以先把数组的第一个元素看成是有序的,让end指向第一个元素,然后把第二个元素当作即将要插入的数据,这样一趟之后,前两个就有序了,然后我们再插入第三个,依次循环往复,当数组最后一个元素进行完插入,整个数组就有序了。在这里插入图片描述

那其实在我们刚才写的一趟直接插入排序的基础上,外层加个循环控制end就行了。

//直接插入排序
void SInsertSort(int* arr, int len)
{
	for (int i = 0; i < len - 1; i++)
	{
		int end = i;
		int tmp = arr[end + 1];
		while (end >= 0)
		{
			if (tmp < arr[end])
			{
				arr[end + 1] = arr[end];
				end--;
			}
			else
			{
				break;
			}
		}
		arr[end + 1] = tmp;
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/552941
推荐阅读
相关标签