排序---python版

 冒泡排序:

  • 比较相邻的元素。如果第一个比第二个大,就交换它们两个;
  • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
  • 针对所有的元素重复以上的步骤,除了最后一个;
  • 重复步骤1~3,直到排序完成。
#冒泡排序
def bubble_sort(list):
    for i in range(len(list)-1):
        for j in range(len(list)-i-1):
            if list[j]>list[j+1]:
                list[j], list[j + 1] = list[j + 1], list[j]
    return list

#冒泡排序改进版
def bubble_sort_better(list):
    for i in range(len(list)-1):
        isSort = True    # 有序标记,每一轮的初始是true,用于判断元素间是否需要交换
        for j in range(len(list)-i-1):    # 这个循环负责控制比较的元素个数
            if list[j]>list[j+1]:
                list[j],list[j+1]=list[j+1],list[j]
                isSort = False    # 有交换行为设为 False
        if isSort:    # 无交换行为(isSorted = True),直接跳过本次循环
            break
    return list

选择排序(Selection Sort)

选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。 

#选择排序:
def select_sort(list):
    for i in range(len(list)-1):
        min = i
        for j in range(i+1,len(list)):   # 第二层for表示最小元素和后面的元素逐个比较
            if list[min]>list[j]:
                min = j    # 如果当前元素比最小元素小,则把当前元素角标记为最小元素角标
        list[min],list[i] = list[i],list[min]

    return list

插入排序(Insertion Sort)

插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

算法描述

一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:

  • 从第一个元素开始,该元素可以认为已经被排序;
  • 取出下一个元素,在已经排序的元素序列中从后向前扫描;
  • 如果该元素(已排序)大于新元素,将该元素移到下一位置;
  • 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
  • 将新元素插入到该位置后;
  • 重复步骤2~5。
#插入排序
def insert_sort(list):
    for i in range(1,len(list)):
        for j in range(i,0,-1):    #range(10,0,-1)意思是从列表的下标为10的元素开始,倒序取到下标为0的元素(但是不包括下标为0元素)
            if list[j]<list[j-1]:
                list[j],list[j-1] = list[j-1] ,list[j]
            else:
                break
    return list

快速排序(Quick Sort)

快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。

算法描述

快速排序使用分治法来把一个串(list)分为两个子串(sub-lists)。具体算法描述如下:

  • 从数列中挑出一个元素,称为 “基准”(pivot);
  • 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
  • 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
#快速排序
def quick_sort(list,start,end):
    if start>=end:    # 递归的退出条件
        return
    mid = list[start]
    low = start
    high = end
    while low < high:
        while low<high and list[high]>=mid:    # 如果low与high未重合,high(右边)指向的元素大于等于基准元素,则high向左移动
            high -= 1
        list[low] = list[high]
        while low<high and list[low]<=mid:    # 如果low与high未重合,low指向的元素比基准元素小,则low向右移动
            low += 1
        list[high] = list[low]
    list[low] = mid    # 将基准元素放到该位置
    quick_sort(list,start,low-1)
    quick_sort(list,low+1,end)
    return list
if __name__ == '__main__':
    list = [2, 15, 5, 9, 7, 6, 4, 12, 5, 4, 2, 64, 5, 6, 4, 2, 3, 54, 45, 4, 44,8,19, 1,10,888,3,56,22,4,45,33,3,44,9,9,11]
    # list1 = quick_sort(list,0,len(list)-1)     #快速排序
    # print(list1)
    #list2 = bubble_sort(list)    #冒泡排序
    #print(list2)
    # list3 = bubble_sort_better(list)    #冒泡优化
    # print(list3)
    # list4 = select_sort(list)   #选择排序
    # print(list4)
    list5 = insert_sort(list)    #插入排序
    print(list5)

 

posted @ 2020-03-08 19:17  图图图图胡图图  阅读(205)  评论(0编辑  收藏  举报