二叉树和二叉查找树
树是计算机科学中经常用到的一种数据结构。树是一种非线性的数据结构,以分层的方式存储数据。
二叉树每个节点的子节点不允许超过两个。一个父节点的两个子节点分别称为左节点和右节点,通过将子节点的个数限定为2,可以写出高效的程序在树中插入、查找和删除数据
。
二叉查找树(BST)是一种特殊的二叉树,相对较小的值保存在左节点中,较大的值保存在右节点中。这一特性使得查找的效率很高
,对于数值型和非数值型的数据,比如单词和字符串,都是如此。
二叉查找树实现方法
function Node(data, left, right) { // 创建节点 this.data = data; this.left = left; this.right = right; this.show = show } function show () { // 显示树的数据 return this.data } function BST () { // 二叉查找树类 this.root = null; this.insert = insert; this.inOrder = inOrder; // inOrder是遍历BST的方式 } function insert (data) { // 向树中插入数据 var n = new Node(data, null, null) if (this.root == null) { this.root = n; } else { var current = this.root; var parent; while (true) { parent = current if (data < current.data) { current = current.left; if (current == null) { parent.left = n; break; } } else { current = current.right; if (current == null) { parent.right = n; break; } } } } }
遍历BST的方式有三种:中序遍历(以升序访问树中所有节点,先访问左节点,再访问根节点,最后访问右节点)、先序遍历(先访问根节点,再以同样的方式访问左节点和右节点)、后序遍历(先访问叶子节点,从左子树到右子树,再到根节点)
排序算法
基本排序算法
基本排序算法,其核心思想是指对一组数组按照一定的顺序重新排列。重新排列时用到的技术是一组嵌套的for循环。其中外循环会遍历数组的每一项,内循环则用于比较元素。
冒泡排序
冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
function bubbleSort (arr) { var i = arr.length; while (i > 0) { var pos = 0 for (var j = 0; j < i; j++) { if (arr[j] > arr[j+1]){ pos = j var temp = arr[j] arr[j] = arr[j+1] arr[j+1] = temp } } i = pos } return arr } var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48]; console.log(bubbleSort(arr));//[2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50]
选择排序
选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
function selectionSort (arr) { var len = arr.length; var minIndex, temp; for (var i = 0; i < len-1; i++) { minIndex = i; for (var j = i+1; j < len; j++) { if (arr[j] < arr[minIndex]) { minIndex = j } } temp = arr[minIndex] arr[minIndex] = arr[i] arr[i] = temp } return arr } var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48]; console.log(selectionSort(arr));//[2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50]
插入排序
插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。、
function insertSort (arr) { var len = arr.length for (i = 1; i < len; i++) { var key = arr[i] var j = i - 1 while (j >= 0 && arr[j] > key) { arr[j+1] = arr[j] j--; } arr[j+1] = key } return arr } var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48];
快速排序
快速排序是处理 大数据集最快的排序算法之一。它是一种分而治之的算法,通过递归的方法将数据依次分解为包含较小元素和较大元素的不同子序列。该算法不断重复这个步骤知道所有数据都是有序的。
这个算法首先要在列表中选择一个元素作为基准值。数据排序围绕基准值进行,将列表中小于基准值的元素移到数组的底部,将大于基准值的元素移到数组的顶部。
function qSort (arr) { if (arr.length == 0) { return [] } var left = [] var right = [] var pivot = arr[0] for (var i = 1; i < arr.length; i++) { if (arr[i] < pivot) { left.push(arr[i]) } else { right.push(arr[i]) } } return qSort(left).concat(pivot, qSort(right)) } var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48]; console.log(qSort(arr));
检索算法
在列表中查找数据有两种方式:顺序查找和二分查找。顺序查找适用于元素随机排列的列表;二分查找适用于元素已排序的列表。二分查找效率更高,但是必须在进行查找之前花费额外的时间将列表中的元素排序。
顺序查找
对于查找数据,最简单的方法就是从列表的第一个元素开始对列表元素逐个进行判断,直到找到了想要的结果,或者直到列表结尾也没有找到。这种方法称为顺序查找,有时也被称为线性查找。
function seqSearch (arr, data) { for (var i = 0; i < arr.length; i++) { if (arr[i] == data) { return i; } } return -1; } var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48]; console.log(seqSearch(arr, 15))
二分查找
二分法查找,也称折半查找,是一种在有序数组中查找特定元素的搜索算法。查找过程可以分为以下步骤:
- 首先,从有序数组的中间的元素开始搜索,如果该元素正好是目标元素(即要查找的元素),则搜索过程结束,否则进行下一步。
- 如果目标元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半区域查找,然后重复第一步的操作。
- 如果某一步数组为空,则表示找不到目标元素。
function binSearch (arr, data) { var low = 0; var high = arr.length - 1 while (low <= high) { var middle = Math.floor((low + high) / 2) if (arr[middle] < data) { low = middle + 1 } else if (arr[middle] > data) { high = middle - 1 } else { return middle } } return -1 } var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48]; console.log(binSearch(arr, 15))