最近在准备笔试题和面试题,把学到的东西整理出来,一来是给自己留个笔记,二来是帮助大家学习。

题目:

给定一个int数组A及数组的大小n,请返回排序后的数组。

测试样例: 
输入:[1,2,3,5,2,3],6
返回:[1,2,2,3,3,5]

代码示例:

冒泡排序:O(n^2)

  最基本的排序,不多解释。

class BubbleSort:
def bubbleSort(self, A, n):
for x in xrange(n):
for y in xrange(n-x-1):
if A[y] > A[y+1]:
A[y], A[y+1] = A[y+1], A[y]
return A

选择排序:O(n^2)

  想象成每次从一大堆数里面选出最小的数放在左边,重复直到这一大对数都被选完。

class SelectionSort:
def selectionSort(self, A, n):
for i in xrange(n-1):
min_index = i
for j in xrange(i+1, n):
if A[min_index] > A[j]:
min_index = j
if min_index != i:
A[i], A[min_index] = A[min_index], A[i]
return A

插入排序:O(n^2)

  想象成打麻将时,摸到一个排插入到已有的麻将里边。选择排序从左边第二个牌开始,与左边的牌比较,如果比左边的小就与其交换位置,依次重复此步骤,直到排序完所有的牌。

class InsertionSort:
def insertionSort(self, A, n):
for i in xrange(1, n):
tmp = A[i]
j = i - 1
while tmp < A[j] and j >= 0:
A[j+1] = A[j]
j -= 1
A[j+1] = tmp
return A

归并排序:O(n*log n)

  分治法思想。把所有的数看成长度为1的有序区间:[1],[2],[3],[5],[2],[3],再将相邻的区间合并成为最大长度为2的有序区间:[1,2],[3,5],[2,3],再合并成为最大长度为4的有序区间:[1,2,3,5],[2,3],再合并:[1,2,2,3,3,5]。

class MergeSort:
def mergeSort(self, A, n):
if n <= 1:
return A
half = n / 2
left = self.mergeSort(A[:half], half)
right = self.mergeSort(A[half:], n-half) result = []
i = j = 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
result += left[i:]
result += right[j:] return result

快速排序:O(n*log n)

  从这些数中随意选一个数,小于这个数的放在它左边,大于它的放右边;再在这左右两边的一堆数重复使用这个方法,直到排序结束。

class QuickSort:
def quickSort(self, A, n=None):
if not A:
return []
else:
key = A[0] # 固定每次选择最左边的数
left = self.quickSort([n for n in A[1:] if n <= key])
right = self.quickSort([n for n in A[1:] if n > key])
return left + [key] + right

 堆排序:

  在这里我们借用wiki的定义来说明: 通常堆是通过一维数组来实现的,在阵列起始位置为0的情况中

    (1)父节点i的左子节点在位置(2*i+1); 
    (2)父节点i的右子节点在位置(2*i+2); 
    (3)子节点i的父节点在位置floor((i-1)/2);

# -*- coding:utf-8 -*-

class HeapSort:
def heapSort(self, A, n):
# 创建大根堆
for i in xrange(n/2 + 1, -1, -1):
self.max_heap_fix(A, i, n)
# 堆排序
for i in xrange(n-1, -1, -1):
A[0], A[i] = A[i], A[0]
self.max_heap_fix(A, 0, i)
return A def max_heap_fix(self, A, i, n):
"""
:param A: 大根堆、一维数组
:param i: 预修复的子树根节点
:param n: 大根堆总的元素数量
"""
j = i * 2 + 1 # i的左子节点下标
# 当i的左子节点存在时
while j < n:
# 当i的右子节点存在,且大于i的左子节点
if j + 1 < n and A[j] < A[j+1]:
j += 1
# 当i的左右子节点都小于i时,修复大根堆结束
if A[j] < A[i]:
break
# 当i的子节点大于i时,交换节点
A[i], A[j] = A[j], A[i]
i = j # 将i移向于i交换的节点
j = i * 2 + 1 # i的左子节点下标

希尔排序:

  插入排序是希尔排序的一种特殊情况,当希尔排序的初始步长为1时,即为插入排序。

class ShellSort:
def shellSort(self, A, n):
step = n / 2
while step > 0:
for i in xrange(step, n):
tmp = A[i]
while i >= step and tmp < A[i-step]:
A[i] = A[i-step]
i -= step
A[i] = tmp
step = step / 2
return A

【程序员笔试面试必会——排序①】Python实现 冒泡排序、选择排序、插入排序、归并排序、快速排序、堆排序、希尔排序的更多相关文章

  1. 【程序员笔试面试必会——排序②】Python实现 计数排序、基数排序

    一.计数排序 概要: 时间复杂度O(n),空间复杂度O(k),k是输入序列的值的范围(最大值-最小值),是稳定的.计数排序一般用于已知输入值的范围相对较小,比如给公司员工的身高体重信息排序. 思路: ...

  2. Python程序员之面试必回习题

    写在前面 近日恰逢学生毕业季,课程后期大家“期待+苦逼”的时刻莫过于每天早上内容回顾和面试题问答部分[临近毕业每天课前用40-60分钟对之前内容回顾.提问和补充,专挑班里不爱说话就的同学回答]. 期待 ...

  3. (转)【推荐】初级.NET程序员,你必须知道的EF知识和经验

    转自:http://www.cnblogs.com/zhaopei/p/5721789.html [推荐]初级.NET程序员,你必须知道的EF知识和经验   阅读目录   [本文已下咒.先顶后看,会涨 ...

  4. 以技术面试官的经验分享毕业生和初级程序员通过面试的技巧(Java后端方向)

    本来想分享毕业生和初级程序员如何进大公司的经验,但后来一想,人各有志,有程序员或许想进成长型或创业型公司或其它类型的公司,所以就干脆来分享些提升技能和通过面试的技巧,技巧我讲,公司你选,两厢便利. 毕 ...

  5. 程序员Web面试之前端框架等知识

    基于前面2篇博客: 程序员Web面试之jQuery 程序员Web面试之JSON 您已经可以顺利进入Web开发的大门. 但是要动手干,还需要了解一些已有的前端框架.UI套件,即要站在巨人肩膀上而不是从轮 ...

  6. 【面试必问】python实例方法、类方法@classmethod、静态方法@staticmethod和属性方法@property区别

    [面试必问]python实例方法.类方法@classmethod.静态方法@staticmethod和属性方法@property区别 1.#类方法@classmethod,只能访问类变量,不能访问实例 ...

  7. 程序员代码面试指南 IT名企算法与数据结构题目最优解

    原文链接 这是一本程序员面试宝典!书中对IT名企代码面试各类题目的最优解进行了总结,并提供了相关代码实现.针对当前程序员面试缺乏权威题目汇总这一痛点,本书选取将近200道真实出现过的经典代码面试题,帮 ...

  8. 选择排序法、冒泡排序法、插入排序法、系统提供的底层sort方法排序之毫秒级比较

    我的代码: package PlaneGame;/** * 选择排序法.冒泡排序法.插入排序法.系统提供的底层sort方法排序之毫秒级比较 * @author Administrator */impo ...

  9. JavaScript 数据结构与算法之美 - 归并排序、快速排序、希尔排序、堆排序

    1. 前言 算法为王. 想学好前端,先练好内功,只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算 ...

随机推荐

  1. linux下dubbo调试 ---telnet命令

    linux下启动dubbo服务端, 怎么调试? 方法有二: 1. 自己写简单消费者功能,进行各种情况测试.(这确实是有必要的) 2. 使用telnet直接连接上dubbo,使用命令调用,然后调试.(这 ...

  2. FB05付款清帐Function

    函数组:FIPI-->内部FI过帐接口1.CALL FUNCTION 'POSTING_INTERFACE_START'. -->Initial information for inter ...

  3. Linux kill和kill-9区别

    进程状态转换图 kill和kill -9,两个命令在linux中都有杀死进程的效果,然而两命令的执行过程却大有不同,在程序中如果用错了,可能会造成莫名其妙的现象. 执行kill命令,系统会发送一个SI ...

  4. Java栈之链式栈存储结构实现

    一.链栈 采用单链表来保存栈中所有元素,这种链式结构的栈称为链栈. 二.栈的链式存储结构实现 package com.ietree.basic.datastructure.stack; /** * 链 ...

  5. Spring的AOP实现

    内容详见切面编程系列 https://www.cnblogs.com/jiyukai/category/1265045.html.

  6. c++之旅:操作符重载

    操作符重载 操作符重载可以为操作符添加更多的含义,操作符重载的作用的对象是类 那些操作符可以重载 除了下面几个操作符不能重载外,其它的操作符都能重载 . :: .* ?: sizeof 操作符重载的本 ...

  7. 20145316 《Java程序设计》 课程总结

    ###20145316许心远<Java学习笔记(第8版)>课程总结 ##每周读书笔记链接汇总 ▪    [第一周读书笔记](http://www.cnblogs.com/xxy745214 ...

  8. ubuntu 14.04 163镜像

    1.备份原来/etc/apt/sources.list 2.以下内容覆盖原来文件内容 deb http://mirrors.163.com/ubuntu/ trusty main restricted ...

  9. 20145216史婧瑶《Java程序设计》第9周学习总结

    20145216 <Java程序设计>第9周学习总结 教材学习内容总结 第十六章 整合数据库 16.1 JDBC入门 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找. ...

  10. 20145301 《Java程序设计》第九周学习总结

    20145301 <Java程序设计>第八周学习总结 教材学习内容总结 整合数据库 JDBC JDBC是用于执行SQL的解决方案,开发人员使用JDBC的标准接口,数据库厂商则对接口进行操作 ...