排序算法总结以及python代码实现

最近在找工作面试的时候总是会被问到排序算法的种种,现在对排序算法进行一个系统的总结。也算是再复习一遍的,有好多自己也忘得差不多了。

排序有内部排序和外部排序两大类。内部排序值得是所有的排序是在内存中进行;外部排序则是因为数据量太大,一次不能将全部数据放在内存中,在排序过程中,需要访问外存。

关于时间复杂度和空间复杂度

由于时间关系,我没有自己画,以下的表格是在别处转的,详见常用排序算法总结

1.插入排序--直接插入排序(Straight Insertion Sort)

基本思想:

将一个记录插入到已经有序的表中,从而得到一个新的,记录数+1的有序表。即:先将序列的第一个记录看成是一个有序的子序列,然后从第二个记录逐个进行插入,直至整个序列有序为止。

如果遇到元素相等时,那么将插入的元素插入到与其相等的元素之后。相等元素的前后顺序并没有改变,所以插入排序是稳定的。

算法的实现:

def insertion_sort(arr):
        arrlen = len(arr)
        for i in range(1, arrlen):
            insert(arr, i)
    
def insert(arr, i):
        tmp = arr[i]
        j = i
        # 查找第i的元素应该的位置, 并且
        # 顺便把比它大的元素往后挪 
        # 其实是用了心思在里面的
        while j > 0 and tmp < arr[j - 1]:
            arr[j] = arr[j - 1]
            j -= 1
            arr[j] = tmp
a = [65,6,3,5,54,65]
insertion_sort(a)
print a

2.希尔排序

基本思想:

希尔排序又叫做缩小增量排序。先将整个序列分割成若干个子序列,并对每个子序列进行直接插入排序,再对全部序列进行直接插入排序。

算法实现:

def shell_sort(seq):
    incr = len(seq)/2
    while(incr>=1):
        for i in range(incr,len(seq)):
            tmp=seq[i]
            pos=i;
            for j in range(i-incr,-1,-incr):
                if seq[j]>tmp:
                    seq[j+incr]=seq[j]
                    pos=j
            seq[pos]=tmp
        incr = incr/2  
    return seq
if __name__ == ‘__main__‘:  
    A = [10, -3, 5, 7, 1, 3, 7]    
    print ‘Before sort:‘,A    
    shell_sort(A)    
    print ‘After sort:‘,A

3.选择排序--简单选择排序

基本思想:

在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换;然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止。

算法实现:

def selectionSort(seq):
    length=len(seq)
    for i in range(length):
        mini=min(seq[i:])
        if seq[i]>mini:
            j=seq.index(mini,i)
            seq[i],seq[j]=seq[j],seq[i]

if __name__==‘__main__‘:
    seq=[3,4,5,9,3,1,5,7,90,-2,]
    selectionSort(seq)
    print(seq)

效率:

最坏情况下,即待排序记录初始状态是按第一条记录最大,之后的记录从小到大顺序排列,则需要移动记录的次数最多为3(n-1)。简单选择排序过程中需要进行的比较次数与初始状态下待排序的记录序列的排列情况无关。当i=1时,需进行n-1次比较;当i=2时,需进行n-2次比较;依次类推,共需要进行的比较次数是(n-1)+(n-2)+…+2+1=n(n-1)/2,即进行比较操作的时间复杂度为O(n^2),进行移动操作的时间复杂度为O(n)。(百度百科

简单选择排序是不稳定排序。

时间: 2024-10-10 08:52:56

排序算法总结以及python代码实现的相关文章

tf–idf算法解释及其python代码实现(下)

tf–idf算法python代码实现 这是我写的一个tf-idf的核心部分的代码,没有完整实现,当然剩下的事情就非常简单了,我们知道tfidf=tf*idf,所以可以分别计算tf和idf值在相乘,首先我们创建一个简单的语料库,作为例子,只有四句话,每句表示一个文档 copus=['我正在学习计算机','它正在吃饭','我的书还在你那儿','今天不上班'] 由于中文需要分词,jieba分词是python里面比较好用的分词工具,所以选用jieba分词,文末是jieba的链接.首先对文档进行分词: i

tf–idf算法解释及其python代码实现(上)

tf–idf算法解释 tf–idf, 是term frequency–inverse document frequency的缩写,它通常用来衡量一个词对在一个语料库中对它所在的文档有多重要,常用在信息检索和文本挖掘中. 一个很自然的想法是在一篇文档中词频越高的词对这篇文档越重要,但同时如果这个词又在非常多的文档中出现的话可能就是很普通的词,没有多少信息,对所在文档贡献不大,例如‘的’这种停用词.所以要综合一个词在所在文档出现次数以及有多少篇文档包含这个词,如果一个词在所在文档出现次数很多同时整个

神经网络和BP算法C及python代码

以上仅给出了代码.具体BP实现原理及神经网络相关知识请见:神经网络和反向传播算法推导 首先是前向传播的计算: 输入: 首先为正整数 n.m.p.t,分别代表特征个数.训练样本个数.隐藏层神经元个数.输出 层神经元个数.其中(1<n<=100,1<m<=1000, 1<p<=100, 1<t<=10). 随后为 m 行,每行有 n+1 个整数.每行代表一个样本中的 n 个特征值 (x 1 , x 2 ,..., x n ) 与样本的 实际观测结果 y.特征值的

排序算法总结(Python)

目录 1. 介绍 1.1 排序算法分类 1.2 关于时间复杂度 1.3 关于稳定性 2. 细节 2.1 冒泡排序 2.2 选择排序 2.3 插入排序 2.4 希尔排序 2.5 归并排序 2.6 快速排序 2.7 堆排序 2.8 计数排序 2.9 桶排序 2.10 基数排序 参考 1. 介绍 1.1 排序算法分类 内部排序: 数据记录在内存中进行排序 外部排序: 因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存 1.2 关于时间复杂度 平方阶(\(O(n^2)\))排序 各类

八大排序算法JS及PHP代码实现

从学习数据结构开始就接触各种算法基础,但是自从应付完考试之后就再也没有练习过,当在开发的时候也是什么时候使用什么时候去查一下,现在在学习JavaScript,趁这个时间再把各种基础算法整理一遍,分别以JS和PHP语法的方式编写代码. 1.冒泡排序 原理:临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换,这样一趟过去后,最大或最小的数字被交换到了最后一位,然后再从头开始进行两两比较交换,直到倒数第二位时结束 时间复杂度:平均情况:O(n2)  最好情况:O(n) 最坏情况:O(n2)

朴素贝叶斯算法简介及python代码实现分析

概念: 贝叶斯定理:贝叶斯理论是以18世纪的一位神学家托马斯.贝叶斯(Thomas Bayes)命名.通常,事件A在事件B(发生)的条件下的概率,与事件B在事件A(发生)的条件下的概率是不一样的:然而,这两者是有确定的关系的,贝叶斯定理就是这种关系的陈述 朴素贝叶斯:朴素贝叶斯方法是基于贝叶斯定理和特征条件独立假设的分类方法.对于给定的训练数据集,首先基于特征条件独立假设学习输入/输出的联合概率分布:然后基于此模型,对给定的输入x,利用贝叶斯定理求出后验概率(Maximum A Posterio

朴素贝叶斯分类算法介绍及python代码实现案例

朴素贝叶斯分类算法 1.朴素贝叶斯分类算法原理 1.1.概述 贝叶斯分类算法是一大类分类算法的总称 贝叶斯分类算法以样本可能属于某类的概率来作为分类依据 朴素贝叶斯分类算法是贝叶斯分类算法中最简单的一种 注:朴素的意思是条件概率独立性 P(A|x1x2x3x4)=p(A|x1)*p(A|x2)p(A|x3)p(A|x4)则为条件概率独立 P(xy|z)=p(xyz)/p(z)=p(xz)/p(z)*p(yz)/p(z) 1.2.算法思想 朴素贝叶斯的思想是这样的: 如果一个事物在一些属性条件发生

常见排序算法思路和简单代码实现

算法名称 算法思路 简单代码实现                        

选择排序算法Java与Python实现

Java 实现 package common; public class SimpleArithmetic { /** * 选择排序 * 输入整形数组:a[n] [4.5.3.7] * 1. 取数组编号为i(i属于[0 , n-2])的数组值 a[i],即第一重循环 * 2. 假定a[i]为数组a[k](k属于[i,n-1])中的最小值a[min],即执行初始化 min =i * 3. 取数组编号为m(m属于[i+1,n-1])的数组值 a[m],即第二重循环 * 4. 若 a[m] < a[m