03插入排序

from base import gen_random_list

"""
将开始索引为start_index,结束索引为end_index的部分数组元素整体向右移动一位,注意end_index的最大取值为len(li)-2
"""
def translation_list(li,start_index,end_index):
    for i in range(end_index,start_index-1,-1):
        li[i+1]=li[i]

'''
测试平移函数
'''
def test_translation_list():
    li_01=[_ for _ in range(10)]
    translation_list(li_01,0,0)
    print(li_01)

    li_02=[_ for _ in range(10)]
    translation_list(li_02,0,1)
    print(li_02)

    li_03=[_ for _ in range(10)]
    translation_list(li_03,1,1)
    print(li_03)

    li_04=[_ for _ in range(10)]
    translation_list(li_04,1,7)
    print(li_04)

    li_05=[_ for _ in range(10)]
    translation_list(li_05,1,8)
    print(li_05)

    li_06=[_ for _ in range(10)]
    try:
        translation_list(li_06,1,9)
    except Exception as e:
        print(e)
    else:
        print(li_06)
'''
测试成功,
输出结果为:
    [0, 0, 2, 3, 4, 5, 6, 7, 8, 9]
    [0, 0, 1, 3, 4, 5, 6, 7, 8, 9]
    [0, 1, 1, 3, 4, 5, 6, 7, 8, 9]
    [0, 1, 1, 2, 3, 4, 5, 6, 7, 9]
    [0, 1, 1, 2, 3, 4, 5, 6, 7, 8]
    list assignment index out of range
'''


#选择排序
"""
核心思想:
    设无序数组的长度为N
    第一趟:从第二个元素(索引为1)开始,其中从左开始,长度为1的列表[index=0]是有序的(顺序为从小到大),我们从第一个元素的位置向右比较,直到第一个位置结束,如果第一个位置的元素大于第二个位置的元素,就将第一个位置元素右移一位,然后将位置为二的元素放到位置为一的地方
    第二趟:从第三个元素(索引为2)开始,其中从左开始,长度为2的[index=0,index=1]是有序的(顺序为从小到大),我们从第一个元素的位置向右开始比较,直到第二个位置结束,如果在比较的过程中遇到位于第i个(i在1到2之间)位置的元素大于第三个位置的元素,就将第i个位直到第二个位置的元素向右移动一位,然后将位置为三的元素放到位置为i的地方
    第三趟:从第四个元素(索引为3)开始,其中从左开始,长度为3的[index=0,index=1,index=2]是有序的(顺序为从小到大),我们从第一个元素的位置向右开始比较,直到第三个位置结束,如果在比较的过程中遇到位于第i个(i在1到3之间)位置的元素大于第四个位置的元素,就将第i个位直到第三个位置的元素向右移动一位,然后将位置为四的元素放到位置为i的地方
    第四趟:从第五个元素(索引为4)开始,其中从左开始,长度为4的[index=0,index=1,index=2,index=3]是有序的(顺序为从小到大),我们从第一个元素的位置向右开始比较,直到第四个位置结束,如果在比较的过程中遇到位于第i个(i在1到4之间)位置的元素大于第五个位置的元素,就将第i个位置到第四个位置的元素向右移动一位,然后将位置为五的元素放到位置为i的地方
    ....
    第N-2趟:从第N-1个元素(索引为N-2)开始,其中从左开始,长度为4的[index=0,index=1,index=2,index=3.....index=N-3]是有序的(顺序为从小到大),我们从第一个元素的位置向右开始比较,直到第N-2个位置结束,如果在比较的过程中遇到位于第i个(i在1到N-2之间)位置的元素大于第N-1个位置的元素,就将第i个位置到第N-2个位置的元素向右移动一位,然后将位置为N-1的元素放到位置为i的地方
    第N-1趟:从第N个元素(索引为N-2)开始,其中从左开始,长度为N-1的[index=0,index=1,index=2,index=3.....index=N-3,index=N-2]是有序的(顺序为从小到大),我们从第一个元素的位置向右开始比较,直到第N-1个位置结束,如果在比较的过程中遇到位于第i个(i在1到N-1之间)位置的元素大于第N个位置的元素,就将第i个位置到第N-1个位置的元素向右移动一位,然后将位置为N的元素放到位置为i的地方
"""
def insert_sort_list_5():
    li=gen_random_list(5)
    print('original li:{}'.format(li))

    len_li=len(li)

    cursor_index=1
    for i in range(0,cursor_index): # i in [0]
        if li[i]>li[cursor_index]:
            temp_val=li[cursor_index]
            translation_list(li,i,cursor_index-1) #start_index=i (i 在此处必为 0),end_index=cursor_index-1=0
            li[i]=temp_val #交换i与cursor_index位置的值
            break
    #完成这轮循环后,我们可以得到[index=0,index=1]的有序部分

    cursor_index=2
    for i in range(0,cursor_index): # i in [0,1]
        if li[i]>li[cursor_index]:
            temp_val=li[cursor_index]
            translation_list(li,i,cursor_index-1) #start_index=i (i 在此处可能为 0,1),end_index=cursor_index-1=1
            li[i]=temp_val #交换i与cursor_index位置的值
            break
    #完成这轮循环后,我们可以得到[index=0,index=1,index=2]的有序部分

    cursor_index=3
    for i in range(0,cursor_index): # i in [0,1,2]
        if li[i]>li[cursor_index]:
            temp_val=li[cursor_index]
            translation_list(li,i,cursor_index-1) #start_index=i (i 在此处可能为 0,1,2),end_index=cursor_index-1=2
            li[i]=temp_val #交换i与cursor_index位置的值
            break
    #完成这轮循环后,我们可以得到[index=0,index=1,index=2,index=3]的有序部分

    cursor_index=4
    for i in range(0,cursor_index): # i in [0,1,2,3]
        if li[i]>li[cursor_index]:
            temp_val=li[cursor_index]
            translation_list(li,i,cursor_index-1) #start_index=i (i 在此处可能为 0,1,2,3),end_index=cursor_index-1=3
            li[i]=temp_val #交换i与cursor_index位置的值
            break
    #完成这轮循环后,我们可以得到[index=0,index=1,index=2,index=3,index=4]的有序部分

    print('sorted li:{}'.format(li))
'''
例如:
    insert_sort_list_5()
输出:
    original li:[63, 60, 70, 62, 61]
    sorted li:[60, 61, 62, 63, 70]
'''

'''
下面我们来看下有序与无序列范围的变化
'''
def insert_sort_list_range(li):
    len_li=len(li)
    if len_li in (0,1):
        return li
    for i in range(1,len_li):
        print('在本轮循环中,只有',[_ for _ in range(i)],'是有序的,',[_ for _ in range(i,len_li)],'是无序列的,我们将',i,'位置的元素插入到有序部分',[_ for _ in range(i)],'中,最终我们得到新的有序部分:',[_ for _ in range(i+1)])
'''
例如:
    insert_sort_list_range(gen_random_list(10))
输出为:
    在本轮循环中,只有 [0] 是有序的, [1, 2, 3, 4, 5, 6, 7, 8, 9] 是无序列的,我们将 1 位置的元素插入到有序部分 [0] 中,最终我们得到新的有序部分: [0, 1]
    在本轮循环中,只有 [0, 1] 是有序的, [2, 3, 4, 5, 6, 7, 8, 9] 是无序列的,我们将 2 位置的元素插入到有序部分 [0, 1] 中,最终我们得到新的有序部分: [0, 1, 2]
    在本轮循环中,只有 [0, 1, 2] 是有序的, [3, 4, 5, 6, 7, 8, 9] 是无序列的,我们将 3 位置的元素插入到有序部分 [0, 1, 2] 中,最终我们得到新的有序部分: [0, 1, 2, 3]
    在本轮循环中,只有 [0, 1, 2, 3] 是有序的, [4, 5, 6, 7, 8, 9] 是无序列的,我们将 4 位置的元素插入到有序部分 [0, 1, 2, 3] 中,最终我们得到新的有序部分: [0, 1, 2, 3, 4]
    在本轮循环中,只有 [0, 1, 2, 3, 4] 是有序的, [5, 6, 7, 8, 9] 是无序列的,我们将 5 位置的元素插入到有序部分 [0, 1, 2, 3, 4] 中,最终我们得到新的有序部分: [0, 1, 2, 3, 4, 5]
    在本轮循环中,只有 [0, 1, 2, 3, 4, 5] 是有序的, [6, 7, 8, 9] 是无序列的,我们将 6 位置的元素插入到有序部分 [0, 1, 2, 3, 4, 5] 中,最终我们得到新的有序部分: [0, 1, 2, 3, 4, 5, 6]
    在本轮循环中,只有 [0, 1, 2, 3, 4, 5, 6] 是有序的, [7, 8, 9] 是无序列的,我们将 7 位置的元素插入到有序部分 [0, 1, 2, 3, 4, 5, 6] 中,最终我们得到新的有序部分: [0, 1, 2, 3, 4, 5, 6, 7]
    在本轮循环中,只有 [0, 1, 2, 3, 4, 5, 6, 7] 是有序的, [8, 9] 是无序列的,我们将 8 位置的元素插入到有序部分 [0, 1, 2, 3, 4, 5, 6, 7] 中,最终我们得到新的有序部分: [0, 1, 2, 3, 4, 5, 6, 7, 8]
    在本轮循环中,只有 [0, 1, 2, 3, 4, 5, 6, 7, 8] 是有序的, [9] 是无序列的,我们将 9 位置的元素插入到有序部分 [0, 1, 2, 3, 4, 5, 6, 7, 8] 中,最终我们得到新的有序部分: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
'''

'''
到这一步我们结合上面的分析,写个插入排序吧
'''
def insert_sort_list(li):
    len_li=len(li)
    if len_li in (0,1):
        return li
    for i in range(1,len_li):
        for j in range(i):
            if li[j]>li[i]:
                temp_val=li[i]
                translation_list(li,j,i-1)
                li[j]=temp_val
                break
    return li
'''
例如:
    original_list=gen_random_list(20)
    print("Original List:{}".format(original_list))
    result_list=insert_sort_list(original_list)
    print("Sorted List:{}".format(result_list))
输出为:
    Original List:[89, 64, 12, 36, 99, 32, 48, 90, 43, 63, 44, 85, 38, 66, 97, 48, 92, 91, 11, 53]
    Sorted List:[11, 12, 32, 36, 38, 43, 44, 48, 48, 53, 63, 64, 66, 85, 89, 90, 91, 92, 97, 99]
'''

'''
我们稍微改造一下,写个尾递归的版本
'''
def insert_sort_list_recursive(li,cursor_index=1):
    len_li=len(li)
    if len_li in (0,1):
        return li
    if cursor_index==len_li:
        return li
    for j in range(cursor_index):
        if li[j]>li[cursor_index]:
            temp_val=li[cursor_index]
            translation_list(li,j,cursor_index-1) #将索引为i到cursor_index-1之间元素右移一位
            li[j]=temp_val
            break
    return insert_sort_list_recursive(li,cursor_index+1)
"""
例如:
    original_list=gen_random_list(20)
    print("Original List:{}".format(original_list))
    result_list=insert_sort_list_recursive(original_list)
    print("Sorted List:{}".format(result_list))
输出为:
    Original List:[14, 85, 34, 33, 62, 68, 77, 72, 85, 89, 35, 52, 43, 73, 14, 22, 86, 70, 24, 99]
    Sorted List:[14, 14, 22, 24, 33, 34, 35, 43, 52, 62, 68, 70, 72, 73, 77, 85, 85, 86, 89, 99]
"""

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容