python八大排序算法

print("冒泡排序")
def bubbleSort(input_list):
    '''
    函数说明:冒泡排序(升序)
    :param input_lis: 待排序列表
    :return:sorted_list :升序排好的列表
    '''
    if len(input_list) == 0:
        return []
    sorted_list = input_list
    for i in range(len(sorted_list)-1):
        bchanged =False
        # print("第%d趟排序:"%(i-1))
        for j in range(len(sorted_list)-1):
            if sorted_list[j + 1] < sorted_list[j]:
                sorted_list[j],sorted_list[j+1] = sorted_list[j+1],sorted_list[j]
                bchanged =True
            # print(sorted_list)
        if not bchanged :
            break
    return sorted_list
if __name__ == '__main__':
    input_list =[50,2,4,5,99,44,33,66,77,88]
    print("排序前",input_list)
    sorted_list = bubbleSort(input_list)
    print("排序后",sorted_list)


print("-"*50)
print('直接插入排序')
def inserSort(input_list):
    '''
    函数说明:直接插入排序
    :param input_list:  待排序的列表
    :return: sorted_list 排序号的列表
    '''
    if len(input_list) == 0 :
        return []
    sorted_list =input_list
    for i in range(1,len(sorted_list)):
        temp = sorted_list[i]
        j = i -1
        while j >=0 and temp < sorted_list[j]:
            sorted_list[j+1] = sorted_list[j]
            j -=1
            sorted_list[j+1] = temp
        return sorted_list
if __name__ == '__main__':
    input_list = [6,4,8,9,2,3,1]
    print("排序前",input_list)
    sorted_list = bubbleSort(input_list)
    print("排序后",sorted_list)


print("-"*50)
print("希尔排序")

def shellSort(input_list):
    length =len(input_list)
    if length <=1:
        return input_list
    sorted_list = input_list
    gap = length // 2
    while gap > 0 :
        for i in range(gap,length):
            j = i -gap
            temp = sorted_list[i]
            while j >= 0 and temp < sorted_list[j]:
                sorted_list[j +gap] = sorted_list[j]
                j -=gap
            sorted_list[j + gap] = temp
        gap //= 2
    return sorted_list
if __name__ == '__main__':
    input_list = [50,123,53,154,34,6,7,46,78,67]
    print("排序前",input_list)
    sorted_list = bubbleSort(input_list)
    print("排序后",sorted_list)

print("-"*50)
'''快速排序'''

def QuickSort(input_list , left,right):
    '''
    函数说明:快速排序(升序)
    :param input_list:
    :param left:
    :param right:
    :return:
    '''
    def division(input_list,left,right):
        '''
        函数说明:根据left和right进行一次扫描,重新找到基准数
        :param input_list: 待排序列
        :param left: 左指针位置
        :param right: 右指针位置
        :return: left 新的基准位置
        '''
        base =input_list[left]
        while left < right :
            while left < right and input_list[right] >=base:
                right -=1
            input_list[left] =input_list[right]
            while left < right and input_list[left] <=base :
                left +=1
            input_list[right] = input_list[left]
        input_list[left] = base
        return left
    if left < right :
        base_index = division(input_list,left,right)
        QuickSort(input_list,left,base_index - 1)
        QuickSort(input_list,base_index + 1,right )
if __name__ == '__main__':
    input_list = [6,3,4,6,7,8,2,1]
    print("排序前",input_list)
    sorted_list = bubbleSort(input_list)
    print("排序后",sorted_list)


print("-"*50)
print("简单选择排序")
def Selectsort(input_list):
    '''
    函数说明:简单选择排序(升序)
    :param input_list: 待排序列表
    :return: sortde_list : 升序排好序的列表
    '''
    if len(input_list) == 0 :
        return []
    sorted_list =input_list
    length = len(sorted_list)
    for i in range(length):
        min_index = 1
        for j in range(i + 1 ,length):
            if sorted_list[min_index] > sorted_list[j]:
                min_index = j
            temp =sorted_list[i]
            sorted_list[i] = sorted_list[min_index]
            sorted_list[min_index] = temp
        return sorted_list
if __name__ =="__main__":
    input_list =[4,3,1,6,7,8,9,5,2]
    print("排序前",input_list)
    sorted_list = bubbleSort(input_list)
    print("排序后",sorted_list)


print("-"*50)
print("堆序列")

def HeadSort(input_list):
    '''
    函数说明:堆排序(升序)
    :param input_list: 待排序列表
    :return: sorted_list:升序排序好的列表
    '''
    def HeadAdjust(input_list,parent,length):
        '''
        函数说明:堆调整,调整为最大堆
        :param input_list: 待排序列表
        :param parent: 堆的父节点
        :param length:  数组长度
        :return: 无
        '''
        temp = input_list[parent]
        child = 2*parent +1
        while child < length :
            if child +1 <length and input_list[child]<input_list[child+1]:
                child +=1
            if temp >=input_list[child]:
                break
            input_list[parent] = input_list[child]
            parent =child
            child = 2 *parent +1
        input_list[parent] = temp
    if len(input_list) == 0 :
        return []
    sorted_list =input_list
    length =len(sorted_list)
    for i in range(0,length // 2 +1 )[::-1]:
        HeadAdjust(sorted_list,i ,length)
    for j in range(1,length)[::-1]:
        temp =sorted_list[j]
        sorted_list[j] = sorted_list[0]
        sorted_list[0] = temp
        HeadAdjust(sorted_list,0,j )
        print("第%d趟排序:"%(length-j ),end="")
        print(sorted_list)
    return sorted_list
if __name__ == '__main__':
    input_list = [3,5,6,7,8,21,2,1]
    print("排序前",input_list)
    sorted_list = bubbleSort(input_list)
    print("排序后",sorted_list)


print("-"*50)
print("归并排序")

def MergeSort(input_list):
    '''
    函数说明:归并排序(升序)
    :param input_list: 待排序列表
    :return: sorted_list:升序排序好的列表
    '''
    def merge(input_list,left,mid,right,temp):
        '''
        函数说明:合并函数
        :param input_list:待合并列表
        :param left: 左指针
        :param mid:
        :param right:右指针
        :param temp: 临时列表
        :return:
        '''
        i = left
        j = mid +1
        k = 0
        while i <= mid and j <= right :
            if input_list[i] <= input_list[j]:
                temp[k] = input_list[i]
                i +=1
            else:
                temp[k] = input_list[j]
                j +=1
            k +=1
        while i <= mid:
            temp[k] = input_list[i]
            i +=1
            k +=1
        while j <=right:
            temp[k] = input_list[j]
            j +=1
            k +=1
    def merge_sort(input_list,left,right,temp):
        if left >= right:
            return
        mid = (right + left) //2
        merge_sort(input_list,left,mid,temp)
        merge_sort(input_list,mid+1,right,temp)
        merge(input_list,left,mid,right,temp)
    if len(input_list) == 0 :
        return []
    sorted_list = input_list
    temp = [0]* len(sorted_list)
    merge_sort(sorted_list,0,len(sorted_list)-1,temp)
    return sorted_list
if __name__ == '__main__':
    input_list = [3,5,6,2,1,0,4,8,9]
    print("排序前",input_list)
    sorted_list = bubbleSort(input_list)
    print("排序后",sorted_list)


print("-"*50)
print("基数排序")

def RadixSort(input_list):
    '''
    函数说明:基数排序(升序)
    :param input_list:  待排序列表
    :return: sorted_list 升序排序好的列表
    '''
    def MaxBit(input_list):
        '''
        函数说明:求出数组中最大数的位数的函数
        :param input_list: 待排序列表
        :return: bits_num 位数
        '''
        max_data = max(input_list)
        bits_num = 0
        while max_data :
            bits_num +=1
            max_data //= 10
        return bits_num
    def digit(num,d):
        '''
        函数说明:取数xxx数上的第d位数字
        :param num: 带操作的数
        :param d: 第d位的数
        :return: 取数结果
        '''
        p = 1
        while d > 1 :
            d -=1
            p *=10
            return num // p % 10
        if len(input_list) ==0:
            return []
        sorted_list = input_list
        lenght = len(sorted_list)
        bucket = [0]*lenght
        for i in range(1,MaxBit(sorted_list)+1):
            count =[0]*10
            for i in range(0,lenght):
                count[i] += count[i -1]
            for i in range(0,lenght)[::-1]:
                k = digit(sorted_list[i],d)
                bucket[count[k]-1] = sorted_list[i]
                count[k] -=1
            for i in range(0,lenght):
                sorted_list[i] =bucket[i]
        return sorted_list
if __name__ == '__main__':
    input_list =[50,123,543,134,5,76,8,6,9,89,56,45]
    print("排序前",input_list)
    sorted_list = bubbleSort(input_list)
    print("排序后",sorted_list)

 

posted @ 2018-08-21 20:29  扎西德勒119  阅读(230)  评论(0编辑  收藏  举报