排序算法与常见数据结构
排序:
一、插入类排序 因为小编太懒,所以后面没有详细写
1、直接插入排序
{49,38,65,97,76,13,27,_49}
1)插49
49 38,65,97,76,13,27,_49
2)插38
38,49 65,97,76,13,27,_49
以此类推。。。
2、折半插入排序 o(nlogn)
low\high
3、希尔排序 (nlogn)
又称缩小增量排序,以增量分割序列,
原始序列:49,38,65,97,76,13,27,_49,55,04
以增量5分割序列得到子序列,然后对子序列进行排序得到一趟希尔排序结果
二、交换类排序
1、冒泡排序 o(n^2)
void BubbleSort(int r[n],iint i,j,flag,temp;for(i=n;i>=2;i--){ //比较个数flag=0;for(j=2;j<=i;j++){if(r[j-1]>r[j]){temp=r[j];r[j]=r[j-1];r[j-1]=temp;flag=1;}if(flag==0){return}}} }
2、快速排序 “枢纽” 最好的情况o(nlogn) 最坏的情况o(n*n)
基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据比另一部分的所有数据都要小,然后再按此方法对这两部分分别进行快排,可以递归进行。
时间复杂度分析:
最好的情况:枢纽选取得当,每次都能均匀的划分两个序列 T(n)=2T(n/2)+f(n)=2(2T(n/4)+f(n/2))+f(n)
最坏的情况:枢纽为最大或最小的数字,其他数都被划分到一个序列去了 相当于冒泡排序了
枢纽可以选择任何位置,一般为开始、结束以及中间位置节点。
代码:
function quickSort(arr){if(arr.length<=1)return arr;var left=[], right=[];var mid=arr.splice(Math.floor(arr.length/2),1);for(var i=0;i<arr.length;i++){if(arr[i]<mid){left.push(arr[i]);}if(arr[i]>mid){right.push(arr[i]);}}return quickSort(left).concat(mid,quickSort(right));//递归 } var array=[2,4,3,6,5,8,7,23,13]; alert(quickSort(array));
三、选择类排序
1、简单选择排序 o(n^2)
从头到尾开始扫描,找出最小的 一个元素,和第一个元素交换,接着从剩下的元素中继续选择和交换
2、堆排序 o(logn)
堆是具有以下性质的完全二叉树:每个节点的值都大于或等于其左右孩子节点的值,称为大顶堆;或者每个节点的值都小于或等于其左右孩子节点的值,称为小顶堆。
function heapSort(arr){ for(var i=Math.floor(arr.length/2)-1;i>=0;i--){//从第一个非叶子节点开始比较 heapAdjust(arr,i,arr.length);}for(var j=arr.length-1;j>0;j--){swap(arr,0,j);//调整为大根堆之后交换第一个和最后一个节点heapAdjust(arr,0,j);//从头再开始调整 }return arr; }function heapAdjust(arr,i,len){var temp=arr[i];var largest=i;//父节点var left=2*i+1;//左孩子var right=2*i+2;//右孩子if(left<len&&arr[left]>arr[largest]){largest=left;}if(right<len&&arr[right]>arr[largest]){largest=right;}if(largest!=i){//说明调整了位置swap(arr,i,largest);//交换位置heapAdjust(arr,largest,len);//交换后的子节点有可能还会比孩子节点小,所以依次比较 } } function swap(arr,i,largest){var temp=arr[i];arr[i]=arr[largest];arr[largest]=temp; }var arr=[2,4,3,6,5,8,7,23,13]; console.log(heapSort(arr));//[2, 3, 4, 5, 6, 7, 8, 13, 23]
常用数据结构:
数据结构是指相互之间存在一种或多种相互关系的数据元素的集合。
线性表、栈和队列、树、图、堆等。
线性表
线性表是最常用且最简单的一种数据结构,它是n个数据元素的有限序列。
线性表有两种:数组和链表
(1)数组是用一组连续的存储单元依次存储线性表的数据元素, 是一种大小固定的数据结构,数组一旦创建后大小就不能改变了。
优点:1.可以通过下标高效地访问数组
缺点:1.数组的大小固定后无法改变
2.数组只能存储一种类型地数据
3。添加、删除的操作慢,因为要移动其他元素
(2)链表
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
每次添加的next或删除元素时,只要改变相关节点的next指向就可以,效率很高。
栈
插入和删除操作只能在栈顶进行,该位置在表的末端。对于栈的基本操作是入栈和出栈。
栈是后进先出表
队列
只允许在表的前端(队头)进行删除操作,在表的末尾(队尾)进行插入操作。
队列是先进先出表
树
树形结构是非线性数据结构,以树和二叉树最常见
图
转载于:https://www.cnblogs.com/xiaoan0705/p/8628853.html
排序算法与常见数据结构相关推荐
- java常见的排序算法_常见排序算法及Java实现
先上个总图↓: ①.直接插入排序 插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并 ...
- 【数据结构排序算法系列】数据结构八大排序算法
排序算法在计算机应用中随处可见,如Windows操作系统的文件管理中会自动对用户创建的文件按照一定的规则排序(这个规则用户可以自定义,默认按照文件名排序)因此熟练掌握各种排序算法是非常重要的,本博客将 ...
- 【排序算法】常见排序算法总结
一.排序算法概述 排序,即将一组数据按照递增或递减的规则进行排列.根据不同的规则,排序算法的分类也不尽相同,常见分类标准有:内部排序和外部排序.内部排序是数据记录在内存中进行排序,而外部排序是因排序的 ...
- 希尔排序算法(思路分析) [数据结构][Java]
希尔排序算法(思路分析) 希尔排序也称之为: 缩小增量排序 希尔排序提出的背景: 因为简单插入排序中存在一些问题( 这里我们以升序排序为例 ): 当我们要待插入的数值比较小时后移的次数明显增多,对效率 ...
- python常见的排序算法_常见排序算法之python实现
1. 冒泡排序 时间复杂度为O(n^2), 稳定的排序算法 思路:一开始比较的区间是[0,n-1],依次比较相邻两数,哪个数大哪个数就放在后面,这样一次遍历数组后,最大的数会在数组的最后一个位置,然后 ...
- 六大排序算法与常见的两大查找算法汇总(C语言)
一.冒泡排序算法: void Bubblesort(int arry[],int len)//冒泡排序算法 ,len为数组长度 {int i,j;for(i=0;i<len-1;i++){for ...
- 【数据结构与算法】常见数据结构及基本操作
数据结构及基本操作 1.数据结构与算法常见概念: 2.数据结构: 2.1线性结构: 基本概念 数组 字符串 队列 栈 链表 2.2树形结构 基本概念 二叉树的递归遍历 二叉树的非递归遍历 2.3图形结 ...
- 【算法】常见数据结构基本算法整理
去年11月份听了牛客网的课,当时做了纸质的笔记整理. 现在为了以后方便查找,将问题目录整理如下. 每道题只提供解题思路,不贴源代码. 可能会稍微手写一下代码(没有在IDE上测,为了试下以后面试时手写代 ...
- 排序算法以及基本数据结构
最新文章
- Java实现队列 链式存储结构
- 【控制】《多智能体机器人系统信息融合与协调》范波老师-第6章-基于分布式强化学习的多 Agent 协调方法
- Linux中常用C/C++一些头文件的作用
- STM32开发 -- 烧写/启动模式
- CentOS6.5系统重启后宕机
- 宝塔面板搭建autoPicCdn:一款基于jsdelivr-Github的免费CDN图床
- 计算机网络军训口号,霸气押韵的16字军训口号(精选50句)
- 知识图谱-KGE-模型:概述【KGE模型充当打分函数的作用】【负采样】【不同模型在不同KG上的表现不一致,需要尝试对比】
- VB.NET自制动态桌面
- Java实现LeetCode第199场周赛(题号5472,5473,5474,5462)
- POJ 1579 记忆化搜索
- RT-Thread创始人新年寄语: 开源如水、商业似船
- java项目启动脚本
- TextMeshPro使用说明
- perform指标分析_ABAQUS与PERFORM-3D在弹塑性时程分析中的应用及对比研究
- 【纯新手教程】mysql8.0.15下载安装教程详解
- 复刻一篇论文中蛋白质结构预测过程1
- flask 外网访问
- 【图像隐藏】基于小波变换+SURF、RANSAC、LT码、CRC码多种算法实现图像隐藏(抗多种攻击)matlab源码
- 我对ubuntu系统的一些感想(常见的安装软件方法以及基本知识)
热门文章
- linux 查看各个cpu使用率
- python的wxpy库_【微信辅助】吃鸡再也不怕了,Python用wxpy实现微信自动回复
- html中url路径是什么意思,url是什么意思?
- android浏览器插件开发,【转】Chrome扩展开发自己的浏览器插件
- python快递费用计算_Python制作快递查询系统,来感受到了Python的强大!
- 彻底理解js是单线程
- position有哪些属性?
- 过年了,就别再背电脑回家。
- c++调试窗口不见了_Sublime Text配置GDB调试环境
- 15.三数之和-LeetCode