分享

Python 面试题

 _王文波 2017-03-09

热文导读 | 点击标题阅读

今天头给我份Python招聘的笔试题,让我看看难度如何?

最后编程大题是: 请使用python实现整数数组的推排序?

由于过于一直对于此排序很触头,如何用python实现让我有些头疼,于是度娘理清了下概念,开始自己实现,并附上推演过程。

  1. span style='font-size:14px;'#! /usr/bin/env python

  2. # -*- coding: utf-8 -*-

  3. # vim: tabstop=4 shiftwidth=4 softtabstop=4

  4. # TODO: left child

  5. # param: index

  6. # return: the index of left child

  7. def leftChild(index):

  8. return index*2+1

  9. # TODO: right child

  10. # param: index

  11. # return: the index of right child

  12. def rightChild(index):

  13. return index*2+2

  14. # TODO: max exchange

  15. # param: array index headSize

  16. def maxHeap(array, index, heapSize):

  17. # 01 Get the left and right node

  18. leftInd = leftChild(index)

  19. rightInd = rightChild(index)

  20. # 02 compare the left,right,index vals

  21. # get the max val and ind

  22. largest = index

  23. if leftInd heapSize and array[index] array[leftInd]:

  24. largest = leftInd

  25. if rightInd heapSize and array[leftInd] array[rightInd]:

  26. largest = rightInd

  27. # 03 exchange the largest and index val when index -ne largest and then recursive

  28. if largest != index:

  29. array[largest], array[index] = array[index], array[largest]

  30. maxHeap(array,largest,heapSize)

  31. # TODO build the heap

  32. # param: array

  33. def buildHeap(array):

  34. for i in range(len(array)/2,-1,-1):

  35. maxHeap(array,i,len(array))

  36. # TODO: heap sort

  37. # param: array

  38. # return: heap sorted array

  39. def heapSort(array):

  40. buildHeap(array)

  41. for i in range(len(array)-1,0,-1):

  42. array[0], array[i] = array[i], array[0]

  43. maxHeap(array,0,i)

  44. arr=[1,2,7,4,34,25,67]

  45. heapSort(arr)

  46. print arrspan

Result: [1, 2, 4, 7, 25, 34, 67]

=============华丽的分割线=================

名词解释:

初始数组: 输入,需要排序的数组

初始堆:基于初始数组,创建符合堆特征的完全二叉树

大根堆头: 大根堆的根节点

无序堆:对排序中取出大根堆头后的剩余堆。

1[0]:1为数组的值,0代表标识位

以下为推演过程:

A. 初始数组: 1[0] 2[1] 7[2] 4[3] 34[4] 25[5] 67[6]

B. 初始堆:

子条件区间:

1. 条件:index = len(arr)/2 值为3

leftChild: 3*2+1=7 rightChild: 3*2+2=8 此时都大于arrSize(heapSize) Pass

2. 条件: 2

leftChild: 2*2+1=5 rightChild: 2*2+2=6 此时最大值67[6],与7[2] 交换。

此时数组变为:1[0] 2[1] 67[2] 4[3] 34[4] 25[5] 7[6]

2.1 子条件: 6

leftChild: 6*2+1=13 rightChild: 6*2+2=14 此时都大于arrSize(heapSize) 递归回归

3. 条件: 1

leftChild: 1*2+1=3 rightChild: 1*2+2=4 此时最大值34[4],与2[1]交换

此时数组变为:1[0] 34[1] 67[2] 4[3] 2[4] 25[5] 7[6]

3.1 子条件:4

leftChild: 4*2+1=9 rightChild: 4*2+2=10 此时都大于arrSize(heapSize) 递归回归

4. 条件:0

leftChild: 0*2+1=1 rightChild: 0*2+2=2 此时最大值67[2],与1[0]交换

此时数组变为: 67[0] 34[1] 1[2] 4[3] 2[4] 25[5] 7[6]

4..1 子条件: 2

leftChild: 2*2+1=5 rightChild: 2*2+2=6 此时最大值25[5], 与1[2]交换

此时数组变为: 67[0] 34[1] 25[2] 4[3] 2[4] 1[5] 7[6]

4.2 子条件:5

leftChild: 5*2+1=11 rightChild: 5*2+2=12 此时都大于arrSize(heapSize) 递归回归

初始堆为:67[0] 34[1] 25[2] 4[3] 2[4] 1[5] 7[6]

树形展示为:

67[0]

/ \

34[1] 25[2]

/ \ / \

4[3] 2[4] 1[5] 7[6]

C 堆排序

注意: 条件一直是无序堆的0

1. 交换大堆根头和最后的一个元素。

交换67[0]与7[6],并将67[0]从无序堆中取出,此时无序堆: 7[0] 34[1] 25[2] 4[3] 2[4] 1[5]

根据条件 0 来整理无序堆(逻辑同上): 34[0] 7[1] 25[2] 4[3] 2[4] 1[5]

2. 交换34[0]与1[5],并将34[0]从无序堆中取出,此时无序堆: 1[0] 7[1] 25[2] 4[3] 2[4]

根据条件 0 来整理无序堆为:25[0] 7[1] 1[2] 4[3] 2[4]

3. 重复1和2

最后无序堆中的元素全部取出,并组成堆排序的最后结果。

[1, 2, 4, 7, 25, 34, 67]

作者 | 图文来自网络、如涉及版权问题,请联系我们以便处理。文章内容纯属作者个人观点,不代表本网观点。

读书吧| QQ群:543839145

-END-

----后台回复对应字母,获取相关精彩内容----

C1】最新教育大数据、编程、科技文章和资料

C2】往期公众号精彩文章

C3】教学视频、直播、教学论坛回顾

C4】计算机类推荐教材

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约