目录
冒泡排序
数列排序的算法之一
将太平放在序列的右端,并比较太平左右的数字
如上图,比较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数字被认为已排序完成,并完成这一轮操作。
此后,重复相同操作,直到所有的数字完成排序。