排序算法-使用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

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= 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)

你可能感兴趣的:(排序算法-使用python实现)