zoukankan      html  css  js  c++  java
  • 深层次两张图解经典6大排序与6大基础数据结构——学完这些,妈妈再也不用担心我的排序算法与数据结构,学习笔记大放送

    本文从冒泡排序撩起,对选择、插入、希尔、归并、快排6种经典的数组排序进行了深入分析,并详解其间的关联,让你深刻理解其中的关键点;同时对经典的数据结构Vector、Stack、Queue、树、Map、Set做了归纳总结,对其底层的实现做了解析,分享给大家,作为每一个中高级程序员应该懂得的算法与排序,祝大家早上走上自己的“成金之路”。

     
    目录:
    1.排序算法
    2.数据结构
    3.资料参考
     
    1.排序算法:
    a.起源:
    计算机从诞生起,就在模拟人这种智能生物的行为,而排序也来自于日常生活中,最经典的冒泡排序即来源于水泡从水底升上水面,离水面越近,水泡体积越大——由此诞生的冒泡排序思想即为:依次遍历每个元素,如果前一个比后一个大,则交换两者的位置。
    其缺点有二:第一点每次比较都会产生交换元素的行为,效率低;第二点,算法复杂度为O(n^2)
     
    b.针对缺点一的优化:
    选择排序:即每次遍历只记录最大元素的下标,最后进行元素交换;
     
    插入排序:当输入有序程度较高时,通过构建有序数组,并将新元素插入到有序数组中,完成整体的排序,降低元素交互的次数,缺点是不稳定;
    希尔排序:插入排序稳定稳定程度太低,因此通过主动构建有序对(间隔n、n/2、n/4...1的有序对),来提升“插入排序”的稳定性,是插入排序的一种改进。
     
    c.针对缺点二的优化:
    归并排序:采用“分治算法思想”,将输入一分为二,分别排序,通过“并行”思想来提升算法效率,复杂度为O(nlgn),但是需要额外的arr[n]空间,来进行合并;
    快速排序:对归并排序的改进,在不需要额外空间的情况下,对数组遍历,按对选定元素的比较进行划分,小的集中在左边,大的集中在右边;分别对两边进行排序——整体的思路与构建二叉树一致,其复杂度为O(nlgn)。
     
    d.伪代码总结如下:
    2.数据结构:
    教学视频参考斯坦福公开课《抽象编程》,地址为http://open.163.com/special/opencourse/abstractions.html 
    这里对主要的数据结构进行了拆解,如下图
    上图只是详解了其底层的结构,但是涉及到使用时,还需要提供一些常见接口,供调用者使用,如size()、iterator()/hasnext()/next()x、add()/remove()、contain()、isEmpty()等;见代码实现分享链接:http://pan.baidu.com/s/1hsoReNa 密码:h9q0。
     
     
    另,附上《抽象编程》总结笔记,链接:http://pan.baidu.com/s/1jI6xZtc 密码:4ik0,希望大家对数据接口及常见的排序有个更深层次的认识,编程时不仅仅会用,还要体会其底层实现,以最高效的方式,来完成程序,走上自己的“成金之路”;另,转载请注明出处(百度搜“成金之路 博客园”)。请不吝“推荐”
     
    3.参考资料:
     
  • 相关阅读:
    DataGrid( 数据表格) 组件[2]
    DataGrid( 数据表格) 组件[1]
    Form( 表单) 组件
    Slider( 滑动条) 组件
    内存管理-常见内存泄露-(5)
    Android 内存管理分析(四)
    Android 之 内存管理-查看内存泄露(三)
    Android 内存管理(二)
    正确认识Android的内存管理机制,合理关闭进程 (一)
    谈谈Runtime类中的freeMemory,totalMemory,maxMemory等几个方法
  • 原文地址:https://www.cnblogs.com/uttu/p/6593579.html
Copyright © 2011-2022 走看看