常用算法之 冒泡、选择、插入、快排

常用简单算法

一、冒泡排序

冒泡排序的基本思想是,对相邻的元素进行两两比较,假设这连个数字是, a、b 同时排序规则是升序,如果a>b 则他们位置进行交换,这样,每一趟会将最小或最大的元素“浮”到顶端,最终达到完全有序.

大概明白是什么意思了就详细的看下下面这张动图,进一步理解

 冒泡排序关键点:

  趟    趟就是我们完成整个排序所需要的次数,一次能认一个数据的位置

  无序区   无序区就是没经过排序的数据

def bubble_sort(li):
    # 确认排序完成所需要循环的次数 -1 是因为最后一个数据不需要循环  趟
    for i in range(len(li) - 1):     
        # 无序区
        for j in range(len(li) -i - 1 ):
            if li[j] > li[j+1]:
                li[j], li[j+1] = li[j+1],li[j]

li = [2,1,3,5,8,88,22,33]
bubble_sort(li)
print(li)

二、选择排序

它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。

思路:

一趟遍历记录最小的数,放到第一个位置;

再一趟遍历记录剩余列表中最小的数,继续放置;

图解:

代码实现

def select_sort(li):
    for i in range(len(li) - 1):
        # 定义基准数值
        mid = i
        # 从当前位置后一个下标开始循环
        for j in range(i + 1,len(li)):
            if li[j] < li[mid]:
                li[j], li[mid] = li[mid], li[j]



select_sort(li)

三、插入排序

插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序。是稳定的排序方法。

列表被分为有序区和无序区两个部分。最初有序区只有一个元素。

每次从无序区选择一个元素,插入到有序区的位置,直到无序区变空。

图解:

def insert_sort(li):
    for i in range(1,len(li)):
        tmp = li[i]
        j = i - 1
        while j >= 0 and tmp < li[j]:
            li[j + 1] = li[j]
            j = j - 1
        li[j + 1] = tmp

ps:

  

  冒泡排序 插入排序 选择排序

  时间复杂度:O(n2)

  空间复杂度:O(1)

 四、快排

  取一个元素p(第一个元素),使元素p归位;

  列表被p分成两部分,左边都比p小,右边都比p大;

   递归完成排序。

  在最优的情况下,快速排序算法的时间复杂度为O(nlogn)。

#### 快速排序
def partition(li, left, right):
    tmp = li[left]
    while left < right:

        while left < right and li[right] > tmp:
            right = right - 1
        li[left] = li[right]

        while left < right and li[left] < tmp:
            left = left + 1
        li[right] = li[left]

    li[left] = tmp

    return left

def quickSort(li, left, right):

    if left < right:
        mid = partition(li, left, right)
        quickSort(li, left, mid - 1)
        quickSort(li, mid+1, right)


quickSort(li, 0, len(li)-1)
print(li)

更详细简单的快排

https://blog.csdn.net/pythondafahao/article/details/80084385

猜你喜欢

转载自www.cnblogs.com/yangwei666/p/9580570.html