算法理解学习笔记(分类)

目录

冒泡排序

选择性排序

插入排序 

堆排序

归并排序

快速排序


冒泡排序

数列排序的算法之一

将太平放在序列的右端,并比较太平左右的数字

如上图,比较7和6=》比较后如果右边的数字较小,则被交换,因为6小于7,所有左右的数字相互交换 

比较完成后,将天平逐一向左移动,同样比较数字 =》重复同样的操作,直到天平移动到左端

天平到达左端,在一系列操作中,数列中最小的数字已经移动到左端=》将天平返回右端,重复相同的操作,直到所有数字都被排序

关键词:天平,相邻数字大小比较, 重复操作

选择性排序

数列排序的算法之一

1. 线性搜索数列并找到最小值。

2. 将最小值替换为列中左端的数字并进行排序

如果最小值已经在左端,则不执行任何操作

3. 重复相同操作,直到所有数字都被排序

4. 排序完成 

关键词:线性搜索、列中右端替换排序 

插入排序 

数列排序的算法之一

1. 首先左端的数字已完成排序

 2. 然后,取出那些尚未操作的左端的数字

3. 将其与已经操作的左侧的数字进行比较,如果左边的数字比较大,交换两个数字

重复此操作,直到出现一个较小是的数字或者数字到达左端

此时5大于3,所以交换数字

 此时数字到达了左端,停止数字移动=》3已完成排序

和之前同样取出左端的数字

与左边的数字进行比较=》4与5比较,再与3比较

由于5大于4,所以交换数字

  由于3小于4,出现了更小的数字,所以4停止移动=》4已完成排序

 4. 重复相同的操作,直到所有的数字完成排序 

 关键词:比较、插入

堆排序

数列排序算法之一,其特点是利用堆的数据结构

1. 首次,将所有的数字存储在堆中。按降序构建堆。

 

 

 在堆中形成的降序后结果图

 所有的数字已存储在堆中。还有更有效的方法来建立堆,但这次我们选择了一个简单的方法

2. 接下来,逐个取出存储在堆中的数字

降堆的一个特性是数据将被从大到小取出,将取出来的数字按相反的顺序排列,数字将完成排序。

7被取出,4沿着线到达之前7在堆中的位置=》6比4大,6与4交换位置 

 按相同的原理,从大到小取出数据,将取出来的数字按相反的顺序排序

3. 所有数字从堆中取出,完成排序

 4. 除了数列之外,还有一个称为堆的数据结构

通常情况下,堆被嵌入到存储数列的排列中,并且只通过交换数字来完成排序。

具体来说,堆上的每个元素(节点)和排列...

如图所示的对应关系

 正如你看到,可以说是堆被强行填满在排列中

现在,让我们尝试使用交换方法对数组进行排序

为了更容易理解,我们将保存显示树结构的堆。

和之前的操作一样,从在堆中存储数字的操作开始。

根据树结构堆中数字的替换,在数组内也进行数字的替换。

 将所有的数字存储在堆中。同时,按降序将数组排序成了堆结构。

 然后,将堆中存储的数字一个个取出,降序堆是从大到小取出数据。

在数组中,第一个数字在堆中是最大的一个数字。

将数组开头的数字替换为堆的最后一个元素对应的数组,并让操作完成。

 

重新组织堆,以保持其结构。

 重复此操作,直到所有的数字完成排序。

 完成排序,结束堆排序的解释。

关键词:降序构建堆、从大到小取出数据

归并排序

 数列排序的算法之一。

1. 首先,将数字分成两半。

 再将数字分成两半

分割完毕。

接下来,我们将结合我们分割的每个组。

合并时,按数字的升序移动,使得合并后的数字在组内按升序排序。

当合并包含多个数字的组时,比较开头的数字,移动较小的数字。 

如图,比较开头的4和3。4大于3,所以移动3。

同样比较其余列的头数...

4小于7,所以移动4 。

6小于7,所以移动6 。

移动剩下的7 。

  

递归地重复组的合并操作,直到所有数字都在一个组中。

 

完成合并,数列将排序。

关键词:分割、比较移动、递归、合并操作

快速排序

与其他算法相比,它的特点是数字的比较和交换次数少,在许多情况下可以高速地进行排序。

第一个操作的对象是数列中所有的数字。

选择一个数字作为排序的基准。这个数字被称为pivot。

pivot通常随机选择一个数字。为了方便起见,我们选择最右边的数字作为pivot。

为了清楚起见,我们将在pivot上做一个标记。

接下来,在最左边的数字上标记左标记 ,最右边的在数字上标记右标记。

快速排序是一种使用这些标记递归地重复一系列操作的算法。

我们将左边的标记向右移动。当左标记达到pivot的数字时,停止移动。

 此时,因为8 >= 6而停止移动。

 继续将右标记向左移动。当右标记达到小于pivot的数字时,停止移动。

由于4 < 6,标记停止移动。

当左右侧的标记停止时,更改标记的数字。

因此,左标记的作用是找到一个大于pivot的数字,右标记的作用是找到一个小于pivot的数字

通过交换数字,可以在数列的左侧收集小于pivot的数字,右侧收集大于pivot的数字。

交换之后,再次将左标记向右移动。

和之前一样,当左边的标记移动到大于或者等于pivot的数字时停止移动。

 当右标记碰撞到左标记也会停止移动。

如果左右侧的标记停止,并在同一个位置时,将这个数字和pivot的数字交换

将有左右侧标记的数字认为已排序完成。

这就完成了第一次操作。

通过一系列操作...

我们可以把比pivot更小的数字放在pivot左边,大于pivot的数字放在右边。 

 

我们将递归地对分成2部分的数列执行一系列操作。

接下来,我们将操作左侧部分的数列。

我们将建立3个标记。

和之前一样进行同样的操作。

 一系列操作结束后...

我们可以把比pivot更小的数字放在pivot左边,大于pivot的数字放在右边。 

另一轮操作重复进行。

对左侧部分的数列进行操作。

如果操作只有一个数字,则认为已完成排序。

第二轮将对右侧部分的数列进行操作。

我们将建立3个标记。

将左标记向右移动。当左右标记碰撞时不会停止移动,它在这方面与右标记不同。 

 当左标记达到数列的最右边时停止移动。这意味着pivot数字在所操作的数列中是最大的数字。

 接下来,移动右标记,但如果左标记已标记时,完成操作并不需要移动。

如果左标记已达到数列的最右边时,pivot数字被认为已排序完成,并完成这一轮操作。

此后,重复相同操作,直到所有的数字完成排序。

猜你喜欢

转载自blog.csdn.net/m0_62110645/article/details/129814844
今日推荐