[算法基础]快排、归并、堆排序比较

1、快速排序,上代码:

def quickSort(arr):
    if len(arr) <= 1:
        return arr
    v = arr[0]
    high = [i for i in arr[1:] if i>=v]
    low = [i for i in arr[1:] if i<v]
    return quickSort(low) + [v] + quickSort(high)

分析一哈:

当不考虑最差情况(O(n^2))时,快排时间复杂度为O(nlogn):因为层数为O(logn)即调用栈的高度是O(logn),而每层的时间是O(n)
2、合并排序

采用分而治之的方法,先把数组分成一个个长度为1的数组,再将数组分别按顺序组合成一个数组

因此涉及到两个过程:切分、组合

1.组合过程:两个有序数组按顺序合并为一个数组def merge(a, b):
    i, j = 0, 0
    c = []
    while i < len(a) and j < len(b):
        if a[i] <= b[j]:
            c.append(a[i])
            i += 1
        else:
            c.append(b[j])
            j += 1
    c.extend(a[i:])
    c.extend(b[j:])
    return c
2.切分过程:只要数组长度大于1就由上而下切割数组,最后自下而上合并
def merge_sort(arr):
    print(arr)
    if len(arr) <= 1:
        return arr
    mid = len(arr) / 2
    # dividing the array up to bottom
    back = merge_sort(arr[:mid])
    fore = merge_sort(arr[mid:])
    # merge every 1 length array to the complete
    return merge(back, fore)

时间复杂度:最好和最差都是O(nlogn)  空间复杂度:O(logn)

以空间换时间的典型栗子

原文地址:https://www.cnblogs.com/halleluyah/p/9746305.html

时间: 2024-11-10 18:33:13

[算法基础]快排、归并、堆排序比较的相关文章

算法基础--快排序,堆排序,归并排序

这是笔记; 快速排序的思想:先说一趟划分:一个数组a[0...(length-1)],把数组的第一个元素当作枢轴v(是vlaue,不是下标),将数组中所有比k小的元素都移动到k的左侧,将所有比v大的元素都移动到元素的右边. 我们需要得到一个数组划分后,枢轴v现在的位置下标(这是下一步进行划分的边界); 长度为n的数组,平均需要log(n)次划分. 代码实现: 1 ///quick sort 2 void quick_sort(int a[],int s,int t){//这是算法的开始,我们看到

排序---内部排序算法(快排、希尔排序、归并排序、基数排序、冒泡、选择排序)比较

1.内部排序的复杂度总结 1)时间复杂度 4种排序的平均时间复杂度是O(nlog2n),"快些以nlog2n的速度归队"(快排.希尔排序.归并.堆排序) 最坏情况下,快排的时间复杂度为O(n*n) 2)空间复杂度 O(log2n)快排 O(n)归并 O(rd)基数 其他都是O(1) 3)稳定性 不稳定的:"考研复习痛苦啊,情绪不稳定,快些选一堆好友来聊天吧"(快排.希尔.简单选择排序.堆排序) 其他都是稳定的. 4)一趟排序,保证一个关键字到达最终位置 交换类(起泡

快排+归并+整数二分

tips: 1.注意边界处理,避免出现死循环 785. 快速排序 /* eg:2 1 2 用i则不能取到左边界,把x取值改成向上取整 用j则不能取到右边界,把x取值改成向下取整 取到边界会导致递归死循环 */ #include<iostream> #include<cstdio> using namespace std; const int N=1e6+10; int n; int q[N]; void quick_sort(int q[], int l, int r){ if(l

排序 之 快排and归并&lt;时间复杂度&gt;----掌握思想和过程

俗话说:天下武功无坚不破,唯快不破.对于算法当然也是要使用时间最短.占用空间最小的算法来实现了. 注意:我代码里面打的备注仅供参考,建议不要背模板(因为没有固定的模板),可以写一个数列按着代码跑两圈或者把代码改一下输出每次排序后的结果. 总之,师傅领进门,修行在个人.奋斗把!骚年! ※冒泡排序.选择排序:(不稳定,时间复杂度 O(n^2)) 1 #include "cstdio" 2 #include "iostream" 3 using namespace std

排序算法——快排思想

快速排序 1.思想 快速排序将一个数组分成两个数组,再对两个数组独立排序,是个递归算法. 首先随机选出一个切分元素temp(一般为这个数组的第一个元素),将小于temp的数放在temp的左边,将大于temp的数放在temp的右边. 快排和堆排序很像,他们都是将一个数组分成两个子数组,都属于递归算法.但是不同之处在于:快排空间复杂度为o(1),而堆排为o(n), 快排是原地排序,只需要一个很小的辅助栈,时间复杂度为NlogN. 2.代码实现(java) public class Quick {  

最简单的两种快排----掌握思想和过程

俗话说:天下武功,无坚不破.对于算法当然也是要使用时间最快.占用空间最小的算法来实现了.下面就是最简单的两种快排(其实可以算是一种). 注意:我代码里面打的备注仅供参考,建议不要背模板(因为没有固定的模板),可以写一个数列按着代码跑两圈或者把代码改一下输出每次排序后的结果. 总之,师傅领进门,修行在个人.奋斗把!骚年! ※冒泡排序.选择排序: 1 #include "cstdio" 2 #include "iostream" 3 using namespace st

大话快排 和 归排的渊源

一:起因 (1)包括冒泡算法.快排算法.插入排序算法等:还有基于外部排序的归并排序(以二路归并排序为例 ) 但是基本上在一个数量级上: (2) mergesort (归并排序) 可以应用在外部排序,这与基于内存的quicksort(快速排序)略有不同,他们的算法复杂度都可以达到O(nlogn) (3)mergesort 是稳定的排序算法,需要额外的空间开销O(n):quicksort 是非稳定的排序算法,额外的空间开销O(1):两者的核心思想都来源与分支的策略(divide and conque

验证元素的唯一性(二重循环法和快排优化)

学校练习,简单的我就不放上来了,值得整理的,我保存一下 习题4 1.1.验证元素唯一性(二重循环)   1.1.1.算法描述 验证元素唯一性,主要方法是:建立两重循环,进行校验每个元素和其他元素的 1.1.2.伪代码   UniqueElements(A[0..m-1]) //验证给定数组中的元素是否唯一 //输入:数组A[0..n-1] //输出:如果A中元素全部唯一,返回true //否则返回false for i<- 0 to n-2 do for j<- i+1 to n-1 do i

常见经典排序算法学习总结,附算法原理及实现代码(插入、shell、冒泡、选择、归并、快排等)

博主在学习过程中深感基础的重要,经典排序算法是数据结构与算法学习过程中重要的一环,这里对笔试面试最常涉及到的7种排序算法(包括插入排序.希尔排序.选择排序.冒泡排序.快速排序.堆排序.归并排序)进行了详解.每一种算法都有基本介绍.算法原理分析.算法代码. 转载请注明出处:http://blog.csdn.net/lsh_2013/article/details/47280135 插入排序 1)算法简介 插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法.它的工作原理是通过