排序算法

冒泡排序

思想

冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端

操作

  1. 比较相邻的元素。如果第一个比第二个大,就交换它们两个;
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
  3. 针对所有的元素重复以上的步骤,除了最后一个;
  4. 重复步骤1~3,直到排序完成。

演示

bubble_sort.gif

python实现

def bubble_sort(arr):
    for i in range(1, len(arr)):
        for j in range(0, len(arr)-i):
            if arr[j] > arr[j+1]:
                arr[j], arr[j + 1] = arr[j + 1], arr[j]
    return arr

选择排序

思想

选择排序是一种简单直观的排序算法,它也是一种交换排序算法,和冒泡排序有一定的相似度,可以认为选择排序是冒泡排序的一种改进。

操作

  1. 从未排列表中找到最大(小)值,放到已排列表首位
  2. 从剩余未排列表中找到最大(小)值,放到已排列表末尾
  3. 重复步骤2,直到所有元素都排好
    注意:这只是思想,在实际操作的时候,考虑的空间复杂度的话,可以在一个列表上做这种操作

演示

select_sort.gif

python实现

def selection_sort(arr):
    for i in range(len(arr) - 1):
        # 记录最小数的索引
        minIndex = i
        for j in range(i + 1, len(arr)):
            if arr[j] < arr[minIndex]:
                minIndex = j
        # i 不是最小数时,将 i 和最小数进行交换
        if i != minIndex:
            arr[i], arr[minIndex] = arr[minIndex], arr[i]
    return arr

插入排序

思想

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

操作

  1. 默认第一个元素放在已排列表
  2. 从剩余未排列表中找到第一个,按顺序插入已排列表
  3. 重复步骤2,直到所有元素都排好
    注意:这只是思想,在实际操作的时候,考虑的空间复杂度的话,可以在一个列表上做这种操作

演示

insert_sort.gif

python实现

def insert_sort(l):    
    """插入排序"""    
    length = len(l)
    for i in range(1,length):                   #默认第一个元素已经在有序序列中,从后面元素开始插入    
        for j in range(i,0,-1):                 #逆向遍历比较,交换位置实现插入        
            if l[j] < l[j-1]:            
                l[j],l[j-1] = l[j-1],l[j]
    return l

选择排序和插入排序听起来很像,但只要注意一个细节即可:选择排序在将满足条件的元素先选出来(遍历未排序列表),再放入到已排序列表中;插入排序是直接从未排序列表中拿一个元素,然后跟已排序列表的每个元素做比较(遍历已排序列表),再插入到合适的位置


快速排序

思想

采用分而治之的思想,将要排序的数据分成两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序。

操作

  1. 从列表中选择一个基准元素,比之大的放到左边,反之右边。
  2. 分别对左右两部分执行步骤1
  3. 重复执行上述步骤,直到不可再分

演示

quick_sort.gif

python实现

def quick_sort(data):    
    """快速排序"""    
    if len(data) >= 2:  # 递归入口及出口        
        mid = data[len(data)//2]  # 选取基准值,也可以选取第一个或最后一个元素        
        left, right = [], []  # 定义基准值左右两侧的列表        
        data.remove(mid)  # 从原始数组中移除基准值        
        for num in data:            
            if num >= mid:                
                right.append(num)            
            else:                
                left.append(num)        
        return quick_sort(left) + [mid] + quick_sort(right)    
    else:        
        return data

参考自:https://www.jianshu.com/p/f81c20235771

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 排序算法 1.基本排序算法 基本排序算法,其核心思想是指对一组数组按照一定的顺序重新排列。重新排列时用到的技术是一...
    hui树阅读 393评论 1 0
  • 本文的最新版本位于:https://github.com/iwhales/algorithms_notes转载请注...
    import_hello阅读 1,451评论 1 17
  • 冒泡排序 我们先来了解一下冒泡排序算法,它是最慢的排序算法之一,但也是一种最容易实现的排序算法。之所以叫冒泡排序是...
    邵志远阅读 810评论 0 0
  • 稳定性:排序算法的稳定性通俗地讲就是能保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相...
    生产八哥阅读 338评论 0 0
  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    迷月闪星情阅读 10,620评论 0 11