点击上方↑↑↑蓝字关注我们~

2019 Python开发者日」全日程揭晓,请扫码咨询 ↑↑↑


0.导语

本节为手撕代码系列之第一弹,主要来手撕排序算法,主要包括以下几大排序算法:

  • 直接插入排序

  • 冒泡排序

  • 选择排序

  • 快速排序

  • 希尔排序

  • 堆排序

  • 归并排序

1.直接插入排序

【算法思想】

每一步将一个待排序的记录,插入到前面已经排好序的有序序列中去,直到插完所有元素为止。

【代码实现】


# 直接插入排序
def insert_sort(arr):
    length = len(arr)
    for i in range(length):
        k = i
        for j in range(k,0,-1):
            if arr[j]<arr[j-1]:
                t = arr[j]
                arr[j]=arr[j-1]
                arr[j-1]=t
arr = [4,3,0,-1]
insert_sort(arr)
print(arr)

2.冒泡排序

【算法思想】

对相邻的元素进行两两比较,顺序相反则进行交换,这样,每一趟会将最小或最大的元素“浮”到顶端,最终达到完全有序。

【代码实现】

# 冒泡排序
def bubbleSort(arr):
    length = len(arr)
    for i in range(length-1):
        flag = True
        for j in range(length-i-1):
            if arr[j]>arr[j+1]:
                t = arr[j]
                arr[j]=arr[j+1]
                arr[j+1]=t
                flag = False
        if flag:
            break
arr = [6,-2,0,9]
bubbleSort(arr)
print(arr)

【算法思想】


每一趟从待排序的数据元素中选择最小(或最大)的一个元素作为首元素,直到所有元素排完为止,简单选择排序是不稳定排序。

【代码实现】

def selectSort(arr):
    length = len(arr)
    for i in range(length-1):
        min = i
        for j in range(i+1,length):
            if arr[min]>arr[j]:
                min=j
        if min!=i:
            t = arr[i]
            arr[i]=arr[min]
            arr[min]=t
arr = [6,-2,0,9]
selectSort(arr)
print(arr)

4.快速排序

【算法思想】

快速排序思想----分治法。

  • 先从数列中取出一个数作为基准数。

  • 分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。

  • 再对左右区间重复第二步,直到各区间只有一个数。

每次划分得到,枢椎的左边比它小,右边比它大。

【代码实现】


def quickSort(arr,left,right):
    # 递归终止条件
    if left>right:
        return
    pivot = arr[left]
    i = left
    j = right
    while i<j:
        while i<j and arr[j]>=pivot:
            j-=1
        while i<j and arr[i]<=pivot:
            i+=1
        if i<j:
            t = arr[i]
            arr[i] = arr[j]
            arr[j] = t
    # 放入枢椎
    arr[left] = arr[i]
    arr[i]=pivot
    # 递归调用左区域
    quickSort(arr,left,i-1)
    # 递归调用右区域
    quickSort(arr,i+1,right)

arr = [6,-2,0,9]
quickSort(arr,0,len(arr)-1)
print(arr)

5.希尔排序


【算法思想】


该算法也被称为:缩小增量排序。

希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

【代码实现】


# 希尔排序
def shellSort(arr):
    length =  len(arr)
    # 设置初始增量
    gap = length//2
    while gap>0:
        # 从第gap个元素,逐个对其所在组进行直接插入排序
        for i in range(gap,length):
            j = i
            while j-gap>=0 and arr[j]<arr[j-gap]:
                t = arr[j]
                arr[j] = arr[j-gap]
                arr[j-gap] = t
                j-=gap
        gap//=2
arr = [6,-2,0,9]
shellSort(arr)
print(arr)

6.堆排序


【算法思想】

堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。

基本思路:

  a.将无需序列构建成一个堆,根据升序降序需求选择大顶堆或小顶堆;

  b.将堆顶元素与末尾元素交换,将最大元素"沉"到数组末端;(升序方法)

  c.重新调整结构,使其满足堆定义,然后继续交换堆顶元素与当前末尾元素,反复执行调整+交换步骤,直到整个序列有序。

【代码实现】


class HeapSort:
    def heapSort(self, nums):
        length = len(nums)
        # 从后往前遍历,交换堆顶与最后叶子节点,并依次调整堆,重复操作
        for j in range(length-1,0,-1):
            # 获取堆顶元素(获取同时,调整堆)
            firstNum = self.adjustHeap(nums,j+1)
            # 交换最后一个叶子节点与堆顶元素
            temp = nums[j]
            nums[j] = firstNum
            nums[0] = temp
        return nums
    # 调整堆(最大堆),每次返回最大堆顶元素
    def adjustHeap(self,nums,length):
        # 最后一个非叶节点
        i = length//2 -1
        # 从最后一个非叶节点开始调整,构成最大堆
        while i>=0:
            temp = nums[i]
            k = 2*i+1
            while k<length:
                if k+1<length and nums[k]<nums[k+1]:
                    k+=1
                if nums[k]>temp:
                    nums[i]=nums[k]
                    i=k
                else:
                    break
                k=2*k+1
            nums[i] = temp
            i-=1
        return nums[0]
s = HeapSort()
nums = [8,9,7,10]
t = s.heapSort(nums)
print(t)

7.归并排序

【算法思想】

归并排序是利用归并的思想实现的排序方法,该算法采用经典的分治策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。

【代码实现】


def mergeSort(nums):
    if len(nums)<=1:
        return nums
    mid = len(nums)//2
    left = mergeSort(nums[:mid])
    right = mergeSort(nums[mid:])
    return merge(left,right)
def merge(left,right):
    result = []
    i,j = 0,0
    while i<len(left) and j<len(right):
        if left[i]<=right[j]:
            result.append(left[i])
            i+=1
        else:
            result.append(right[j])
            j+=1
    if i<len(left):
        result+=left[i:]
    if j<len(right):
        result+=right[j:]
    return result
nums = [5,3,0,6,1,4]
t = mergeSort(nums)
print(t)

(本文为 AI大本营转载文章,转载请联系原作者

精彩推荐

「2019 Python开发者日」演讲议题全揭晓!这一次我们依然“只讲技术,拒绝空谈”10余位一线Python技术专家共同打造一场硬核技术大会。更有深度培训实操环节,为开发者们带来更多深度实战机会。更多详细信息请咨询13581782348(微信同号)。

推荐阅读:

  • 技术头条

  • 收藏指数爆表!CVPR 2018-2019几十篇优质论文解读大礼包! | 技术头条

  • 分析11年21部漫威电影,一览导演、主演、口碑票房最佳......

  • 靠找Bug赚了6,700,000元!他凭什么?

  • 30位90后霸榜! 福布斯: 比你年轻、比你有颜、比你有才华, 就是他们了!

  • 程序员深夜逆行被拦后崩溃欲自杀:老板在催我!女朋友在催我!

  • 微软 CTO 韦青:“程序员 35 岁就被淘汰”是个伪概念 | 人物志

  • OpenStack已死?恐怕你想多了 | 技术头条

❤点击“阅读原文”,查看历史精彩文章。

手撕代码之七大常用排序算法 | 附完整代码相关推荐

  1. C语言实现冒泡排序(bubble排序)算法(附完整源码)

    冒泡排序bubble排序算法 冒泡排序(bubble排序)算法的完整源码(定义,实现,main函数测试) 冒泡排序(bubble排序)算法的完整源码(定义,实现,main函数测试) #include ...

  2. html5 css 3d动画效果代码,css3D+动画的例子(附完整代码)

    本篇文章给大家带来的内容是关于css3D+动画的例子(附完整代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 前言 最近玩了玩用css来构建3D效果,写了几个demo,所以博客总 ...

  3. 手撕前端面试之经典排序算法

    作者 | 霍语佳       责编 | 欧阳姝黎 排序算法是面试中的高频考察点,我们需要熟练掌握.本文整理了最经典.最常用的排序算法并且搭配了动图和视频,希望能够帮助你更加轻松的理解它们. 首先,根据 ...

  4. C语言经典排序算法的完整代码

    排序 1.插入排序 1.1直接插入排序 int insertSort(int array[],int n){int i , j;int tempNum;for(i = 1; i < n;i++) ...

  5. c语言选择排序详解及代码,C语言选择排序算法及实例代码

    选择排序是排序算法的一种,这里以从小到大排序为例进行讲解. 基本思想及举例说明 选择排序(从小到大)的基本思想是,首先,选出最小的数,放在第一个位置:然后,选出第二小的数,放在第二个位置:以此类推,直 ...

  6. C++实现对链表的选择排序算法(附完整源码)

    C++实现对链表的选择排序算法 C++实现对链表的选择排序算法完整源码(定义,实现,main函数测试) C++实现对链表的选择排序算法完整源码(定义,实现,main函数测试) #include < ...

  7. C++实现topological sort拓扑排序算法(附完整源码)

    C++实现topological sort拓扑排序算法 C++实现topological sort拓扑排序算法完整源码(定义,实现,main函数测试) C++实现topological sort拓扑排 ...

  8. C++使用kahn实现topological sort拓扑排序算法(附完整源码)

    C++使用kahn实现topological sort拓扑排序算法 C++使用kahn实现topological sort拓扑排序算法完整源码(定义,实现,main函数测试) C++使用kahn实现t ...

  9. C++ 实现无向图的最小生成树Prim算法(附完整代码)

    实现Prim算法,需设置两个辅助一维数组lowcost和closevertex. 其中lowcost用来保存集合V-U中各顶点与集合U中各顶点构成的边中具有最小权值的边的权值: 数组closevert ...

最新文章

  1. 威斯康辛大学《机器学习导论》2020秋季课程完结,课件、视频资源已开放(附下载)...
  2. window.open 打开新窗口被拦截的其他解决方法
  3. python绘制基因结构图_从 gff 到 gggenes 绘制基因结构图
  4. 有三AI一周年了,说说我们的初衷,生态和愿景
  5. 相对熵与交叉熵的区别
  6. 线性代数可以速成吗_英语真的可以速成吗?
  7. php中的id怎么传值,uniapp如何跳转页面传值
  8. delphi 获取打印机默认纸张_Delphi 动态调整打印机纸张大小
  9. Hibernate之DetachedCriteria类详解
  10. 修改Jmeter中乱码问题
  11. python禁用键盘鼠标_在Python中禁用或锁定鼠标和键盘?
  12. vue+vuex初入门
  13. sqlmap使用教程大全命令大全(图文)
  14. steam,epic,origin限免游戏推送,持续更新
  15. 在表格中显示形位公差符号
  16. SpringBoot + Vue基本知识点荟萃
  17. 小米android6.01 root,小米 小米6(安卓8.0)获取Root权限服务含精简系统方案
  18. [经验] 系统封装常见问题大总结(非官方)
  19. mysql创建/编辑表时的 ROW_FORMAT = Dynamic 和 Compact 有什么区别
  20. 华为服务器虚拟云主机,虚拟云主机和虚拟云服务器

热门文章

  1. Android获取内部和SDCard的存储空间
  2. 辞职之后的思考--激励
  3. php pkcs 1格式的公钥,解说--2--微信支付RSA公钥PKCS1格式转化成PKCS8格式的公钥
  4. C#/.Net判断是否为周末/节假日
  5. 牛客国庆集训派对Day6 B.Board
  6. GitLab 配置邮箱
  7. 多线程并行和并发的区别
  8. 一篇价值百万的文章:我为什么在22岁辞去年薪150万的工作?
  9. OpenStack Heat模板详解
  10. Linux内核之内存管理(4)--缺页处理程序