算法和数据结构

学习算法想要深入的话,必须要学习数据结构,无奈本科学过现在忘的差不多,只能花了一天时间来总结一下。想看的时候再来看一下

1 入门:算法初级
• 排序算法列表 https://zh.wikipedia.org/wiki/%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95#排序算法列表
• 冒泡排序 http://bubkoo.com/2014/01/12/sort-algorithm/bubble-sort/
• 插入排序 http://bubkoo.com/2014/01/14/sort-algorithm/insertion-sort/
• 桶排序 http://bubkoo.com/2014/01/15/sort-algorithm/bucket-sort/
• 其他排序:http://bubkoo.com/tags/algorithm/
2 伪代码与流程图
3 结构化编程
https://zh.wikipedia.org/zh-hans/%E7%BB%93%E6%9E%84%E5%8C%96%E7%BC%96%E7%A8%8B

  1. 一行一行执行
  2. 有条件控制语句 if…else…
  3. 有循环控制语句 while(exp) do…
    什么是数据结构
    就是数据的结构。
    一般来说是这样的:
  4. 我们要解决一个跟数据相关的问题
  5. 分析这个问题,想出对应的数据结构
  6. 分析数据结构,想出算法
    数据结构和算法是互相依存、不可分开的
    你学习完排序算法,就能了解常见的数据结构
    大分类
    • 分治法:把一个问题分区成互相独立的多个部分分别求解的思路。这种求解思路带来的好处之一是便于进行并行计算。
    • 动态规划法:当问题的整体最优解就是由局部最优解组成的时候,经常采用的一种方法。
    • 贪婪算法:常见的近似求解思路。当问题的整体最优解不是(或无法证明是)由局部最优解组成,且对解的最优性没有要求的时候,可以采用的一种方法。
    • 线性规划法:见词条。
    • 简并法:把一个问题通过逻辑或数学推理,简化成与之等价或者近似的、相对简单的模型,进而求解的方法。
    我们前端主要使用分治法——分而治之。
    排序算法
    中国学生学不好排序算法主要是因为这些算法的名字是外国人取的
  7. 体育委员两两摸头法(冒泡排序)
  8. 体育老师一指禅法(选择排序)
  9. 起扑克牌法(插入排序)
  10. 强迫症收扑克牌法(基数排序)
  11. 快排(可选择随机排序加快速度)
  12. 归并排序
  13. 堆排序
    排序可视化:https://visualgo.net/bn/sorting

2 数据结构

  1. 哈希(Hash)
    • 计数排序中的桶(复杂度 O(n+max),比快排还快
    • 桶排序 (http://bubkoo.com/2014/01/15/sort-algorithm/bucket-sort/)与计数排序的区别
    • 基数排序(http://bubkoo.com/2014/01/15/sort-algorithm/radix-sort/) 与计数排序的区别
  2. 队列(Queue)
    • 先进先出
    • 可以用数组实现
    • 举例:排队
  3. 栈(Stack)
    • 先进后出
    • 可以用数组实现
    • 举例:盗梦空间
  4. 链表(Linked List)
    • 数组无法直接删除中间的一项,链表可以
    • 用哈希(JS里面用对象表示哈希)实现链表
    • head、node 概念
  5. 树(tree)
    • 举例:层级结构、DOM
    • 概念:层数、深度、节点个数
    • 二叉树(https://zh.wikipedia.org/wiki/%E4%BA%8C%E5%8F%89%E6%A0%91)
    • 满二叉树
    • 完全二叉树
    • 完全二叉树和满二叉树可以用数组实现
    • 其他树可以用哈希(对象)实现
    • 操作:增删改查
    • 堆排序用到了 tree
    • 其他:B 树(https://zh.wikipedia.org/wiki/B%E6%A0%91)、红黑树(https://zh.wikipedia.org/wiki/%E7%BA%A2%E9%BB%91%E6%A0%91)、AVL树(https://zh.wikipedia.org/wiki/AVL%E6%A0%91)
    堆排序可视化:https://www.cs.usfca.edu/~galles/visualization/HeapSort.html
    堆排序JS代码完整讲解(看到最后):http://bubkoo.com/2014/01/14/sort-algorithm/heap-sort/

上面的网址不稳定,打不开了,还是写到这篇文章里吧。
一、冒泡排序

大致分两步:

1、依次对比相邻2个数字,前者比后者大就调换位置

2、重复第一步操作,直到所有数字都按顺序排列

function bubbleSort(arr){
  for(var i=1; i<arr.length; i++){
   for(var j=0; j<arr.length-i; j++){
    if(arr[j]>arr[j+1]){
      var temp=arr[j];
       arr[j]=arr[j+1];
        arr[j+1]=temp;
    }
   }
  }
  return arr;
}

二、快速排序

大致分三步:

1、找基准(一般是以中间项为基准)
2、遍历数组,小于基准的放在left,大于基准的放在right
3、递归

function quickSort(arr){
   //如果数组<=1,则直接返回
   if(arr.length<=1){return arr;}
   var pivotIndex=Math.floor(arr.length/2);
   //找基准,并把基准从原数组删除
   var pivot=arr.splice(pivotIndex,1)[0];
   //定义左右数组
   var left=[], right=[];
   //比基准小的放在left,比基准大的放在right
   for(var i=0;i<arr.length;i++){
    if(arr[i]<=pivot){
     left.push(arr[i]);
    }else{
     right.push(arr[i]);
    }
   }
   //递归
   return quickSort(left).concat(pivot, quickSort(right));
}

三、插入排序(对于少量元素比较有效)

原理:像排序一手扑克牌,开始时,我们的左手为空并且桌子上的牌面向下。然后,我们每次从桌子上拿走一张牌并将它插入左手中正确的

位置。为了找到一张牌的正确位置,我们从右到左将它与已在手中的每张牌进行比较,如图2-1所示。拿在左手上的牌总是排序好的,原来这些牌是桌子上牌堆中顶部的牌。

手上的牌是有序数列,桌子上的牌是无序数列。
在这里插入图片描述

function insertSort(arr){
  //从第二个数开始,依次插入
  for(var i=1; i<arr.length; i++){
   //判断目标元素是否小于前一个元素
   if(arr[i]<arr[i-1]){
    var current=arr[i];
    var j=i-1;
    //从有序数列从后往前对比,如果目标元素小于与之对比的当前元素,当前元素位置往后挪一位
    while(j>=0 && current<arr[j]) {
     arr[j+1]=arr[j];
     j--;
    }
    //插入
    arr[j+1]=current;
   }
  }
  return arr;
}

插入排序另一种写法(个人感觉还是这种效率快)

function insertSort(arr) {
  for(let i=1; i<arr.length; i++) {
    if(arr[i] < arr[0]) {
      arr.unshift(arr.splice(i,1)[0]);
    }else {
      for(let j=i-1; j>=0; j--) {
        if(arr[i] > arr[j]) {
          let current = arr.splice(i,1)[0];
          arr.splice(j+1,0,current);
          break;
        }
      }
    }
  }
  return arr;
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java算法数据结构指的是在使用Java编程语言时,用于解决问题和组织数据的方法和技术。 数据结构是计算机存储和组织数据的方式,它由相互之间存在特定关系的数据元素的集合组成。精心选择的数据结构可以提高程序的运行效率和存储效率。常用的数据结构包括数组、链表、栈、队列、树和图等。Java提供了一些内置的数据结构类和接口,例如ArrayList、LinkedList和HashMap等,可以方便地应用于各种问题的解决。 算法则是为了更有效地处理数据,提高数据运算效率而研究的方法和技术。算法是在数据的逻辑结构上定义的操作序列,用于解决特定的问题。在Java中,可以使用各种算法来实现排序、搜索、图算法等。Java提供了一些内置的算法类和接口,例如Collections类中的sort方法可以用于对集合进行排序,以及java.util包中的各种排序和搜索算法。 因此,Java算法数据结构是指在使用Java编程语言时,利用适当的数据结构以及选择和实现高效的算法来解决问题和处理数据的方法和技术。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Java 数据结构算法](https://blog.csdn.net/yuan_dai_ma/article/details/113996341)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值