直接插入排序和希尔排序
Posted 一件风衣
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了直接插入排序和希尔排序相关的知识,希望对你有一定的参考价值。
昨天是个神奇的一天,妹妹来访,超开心!这一天神奇的事很多,首先光是没有下雨就已经很值得开心了!下午还在西湖附近,报警救助了一个似乎是刚脱离传销组织的姑娘?好人一生平安!(这些就是你拖稿一天的理由吗?)
直接插入排序
直接插入排序是经典的排序算法之一,在这个系列的第一章我们有提到,使用的是扑克牌排序的例子,今天我们就更深入的学习一下这个排序算法,也为后半段的希尔排序打下基础。
(一)直接插入排序思想
思想只有一句话:把一个数插入到一个有序数组的合适位置!
让我们再回想一下扑克牌的排序过程:
1.假设我们从左到右按照A,2,3……,J,Q,K的顺序来排列扑克牌,现在牌堆里有5张牌;
2.我们抽取第一张牌,是4,放入手中;
3.抽取的第二张牌是7,比4大,插入到4的右边;
4.抽取的第三张牌是A,比4小,插入到4的左边;
5.抽取的第四张牌是K,比7大,插入到7的右边;
6.抽取,的第五张牌是3,比A大,但是比4小,插入到A和4的中间;
7.排序完毕,我们得到的顺序牌组为A,3,4,7,K。
(二)直接插入排序图解
计算机不能做到和我们人类一样,一眼看到刚抓到手中的牌应该插入到什么位置,所以计算机需要从已经排好的牌组的最左边一直比较,直到比较到一个合适的位置,插入那个新牌。
我们以数组[5,7,3,1,8,4,2,6]为例,图解如下:
(三)直接插入排序可视化演示
(四)直接插入排序算法的Python实现
# 直接插入排序
def InsertionSort(myList):
length = len(myList)
for i in range(1,length):
j = i - 1
# 遍历已经有序的数组部分
# 将数插入合适的部分
# 并将后面的元素后移
if(myList[i] < myList[j]):
temp = myList[i]
myList[i] = myList[j]
j = j-1
while j>=0 and myList[j] > temp:
myList[j+1] = myList[j]
j = j-1
myList[j+1] = temp
if __name__ == "__main__":
array = [5, 7, 3, 1, 8, 4, 2, 6]
InsertionSort(array)
希尔排序算法
希尔排序的灵魂就是直接插入排序算法,在数组基本有序的时候,直接插入排序可以达到线性效率,但是如果数组是一般的,那么直接插入排序效率就很低,而希尔排序本质上就是一种分组的插入排序算法。
(一)希尔排序思想
希尔排序又叫作缩小增量排序,排序过程如下:
1.对于一个长度为n的待排数组,首先取一个比n小的增量d,这个增量的意思的是两个元素之间的间隔;
2.对于这个间隔d,我们把数组分为若干个子数组,对每个子数组进行直接插入排序;
3.缩小间隔d,重复步骤2和3,直到d为1时,完成直接排序时就得到了一个有序数组。
这个思想有点似乎从字面上理解来比较抽象,我们还是以图解的方式来解释这个过程,其实也很简单。
(二)希尔排序图解
依然以一个长度为8的数组[5,7,3,1,8,4,2,6]为例:
(三)希尔排序可视化演示
(四)希尔排序算法的Python实现
# 希尔排序中的直接插入排序
def ShellInsetSort(array, len_array, d):
for i in range(d, len_array):
position = i
current_val = array[position]
index = i
j = int(index / d)
index = index - j * d
while position > index and current_val < array[position-d]:
array[position] = array[position-d]
position = position-d
else:
array[position] = current_val
# 希尔排序
def ShellSort(array, len_array):
# 增量
d = int(len_array/2)
while(d >= 1):
ShellInsetSort(array, len_array, d)
print(" ↓\n",array, "d=", d)
d = int(d/2)
if __name__ == "__main__":
array = [5, 7, 3, 1, 8, 4, 2, 6]
print("\n", array)
ShellSort(array, len(array))
奉太郎说
希尔排序的核心思想就是构造基本有序这种特殊情况,每一次排序都很高效地向基本有序接近,最后进行直接插入排序效率就很高啦!
下一篇我们会一起学习类似的一对排序算法——简单选择排序和堆排序!
以上是关于直接插入排序和希尔排序的主要内容,如果未能解决你的问题,请参考以下文章
直接插入排序 ,折半插入排序 ,简单选择排序, 希尔排序 ,冒泡排序 ,快速排序 ,堆排序 ,归并排序的图示以及代码,十分清楚