排序算法-使用python实现

最近面试中经常考察排序算法,所以这里用python实现一下常用的排序算法。

1、直接插入排序

"""插入排序"""

def insertion_sort(a_list):
    for index in range(1,len(a_list)):
        current_value = a_list[index]
        #这里不能减1
        position = index
        # 这里比较的是前一个位置的值
        while position > 0 and a_list[position - 1]> current_value:
            a_list[position] = a_list[position - 1]
            position -= 1
        a_list[position] = current_value


def insertion_sort_binarysearch(a_list):
    for index in range(1,len(a_list)):
        low = 0
        high = index - 1
        current_value = a_list[index]
        position = index
        while low<=high:
            middle = (low+high)//2
            if a_list[middle] > current_value:
                high = middle -1
            else:
                low = middle + 1
        while position > low:
            a_list[position] = a_list[position - 1]
            position -= 1
        a_list[low] = current_value

a_list = [54, 26, 93, 15, 77, 31, 44, 55, 20]
insertion_sort(a_list)
print(a_list)
insertion_sort_binarysearch(a_list)
print(a_list)

2、冒泡排序

def short_bubble_sort(a_list):
    pass_num = len(a_list)-1
    exchanges = True
    while pass_num > 0 and exchanges:
        exchanges = False
        for i in range(pass_num):
            if a_list[i] > a_list[i+1]:
                a_list[i],a_list[i+1] = a_list[i+1],a_list[i]
                exchanges = True

        pass_num -= 1

3、选择排序

"""选择排序"""

def selection_sort(a_list):
    for fill_slot in range(len(a_list)-1,0,-1):
        max_index = 0
        for i in range(1,fill_slot+1):
            if a_list[i] > a_list[max_index]:
                max_index=i

        a_list[max_index],a_list[fill_slot] = a_list[fill_slot],a_list[max_index]

if __name__ == '__main__':
    a_list = [54, 26, 93, 17, 77, 31, 44, 55, 20]
    selection_sort(a_list)
    print(a_list)

4、归并排序

def merge_sort(a_list):
    print("Splitting ", a_list)
    if len(a_list) > 1:
        mid = len(a_list)//2
        left_half = a_list[:mid]
        right_half = a_list[mid:]
        merge_sort(left_half)
        merge_sort(right_half)
        i=0
        j=0
        k=0
        while i<len(left_half) and j<len(right_half):
            if left_half[i] < right_half[j]:
                a_list[k]=left_half[i]
                i+=1
                k+=1
            else:
                a_list[k] = right_half[j]
                j+=1
                k+=1
        while i<len(left_half):
            a_list[k]=left_half[i]
            i+=1
            k+=1
        while j<len(right_half):
            a_list[k] = right_half[j]
            j+=1
            k+=1
    print ('Mergeing',a_list)

5、希尔排序

def shell_sort(a_list):
    #how many sublists, also how many elements in a sublist
    sublist_count = len(a_list) // 2
    while sublist_count > 0:
        for start_position in range(sublist_count):
            gap_insertion_sort(a_list, start_position, sublist_count)
        print("After increments of size", sublist_count, "The list is", a_list)
        sublist_count = sublist_count // 2

def gap_insertion_sort(a_list, start, gap):
    #start+gap is the second element in this sublist
    for i in range(start + gap, len(a_list), gap):
        current_value = a_list[i]
        position = i
        while position >= gap and a_list[position - gap] > current_value:
            a_list[position] = a_list[position - gap] #move backward
            position = position - gap
            a_list[position] = current_value


a_list = [54, 26, 93, 17, 77, 31, 44, 55, 20, 88]
shell_sort(a_list)
print(a_list)

6、快速排序

def quick_sort(a_list):
    quick_sort_helper(a_list,0,len(a_list)-1)

def quick_sort_helper(a_list,first,last):
    if first<last:
        split_point = partition(a_list,first,last)
        quick_sort_helper(a_list,0,split_point-1)
        quick_sort_helper(a_list,split_point+1,last)

def partition(a_list,first,last):
    pivot_value = a_list[first]
    left_mark=first+1
    right_mark=last
    done = False
    while not done:
        while left_mark <= right_mark and a_list[left_mark] <= pivot_value:
            left_mark+=1
        while a_list[right_mark] >= pivot_value and right_mark >= left_mark:
            right_mark -= 1
        if right_mark < left_mark:
            done = True
        else:
            a_list[right_mark],a_list[left_mark] = a_list[left_mark],a_list[right_mark]

    a_list[first],a_list[right_mark] = a_list[right_mark],a_list[first]

    return left_mark

a_list = [54, 26, 93, 17, 77, 31, 44, 55, 20]
my_quick_sort(a_list)
print(a_list)

7、堆排序

def perceDown(a_list,i,N):
    temp = a_list[i]
    while (2*i + 1) < N:
        child = 2 * i + 1
        if child < N - 1 and a_list[child+1] > a_list[child]:
            child = child + 1
        if temp < a_list[child]:
            a_list[i] = a_list[child]
            i = child
        else:
            break
    a_list[i] = temp


def heap_sort(a_list,N):
    for i in range(N//2,-1,-1):
        perceDown(a_list,i,N)
    for i in range(N-1,-1,-1):
        a_list[0],a_list[i] = a_list[i],a_list[0]
        perceDown(a_list,0,i)


if __name__ == '__main__':
    a_list = [54, 26, 93, 17, 77, 31, 44, 55, 20]
    heap_sort(a_list,9)
    print(a_list)

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

推荐阅读更多精彩内容