关键词:
关于排序算法的问题可以在网上搜到一大堆,但是纯 JS 版比较零散,之前面试的时候特意整理了一遍,附带排序效率比较。
//1.冒泡排序 var bubbleSort = function(arr) { for (var i = 0, len = arr.length; i < len - 1; i++) { for (var j = i + 1; j < len; j++) { if (arr[i] > arr[j]) { var temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } } return arr; }; //2.选择排序 var selectSort = function(arr) { var min; for (var i = 0; i < arr.length - 1; i++) { min = i; for (var j = i + 1; j < arr.length; j++) { if (arr[min] > arr[j]) { min = j; } } if (i != min) { swap(arr, i, min); } console.log(i + 1, ": " + arr); } return arr; }; function swap(arr, index1, index2) { var temp = arr[index1]; arr[index1] = arr[index2]; arr[index2] = temp; }; //3.插入排序 var insertSort = function(arr) { var len = arr.length, key; for (var i = 1; i < len; i++) { var j = i; key = arr[j]; while (--j > -1) { if (arr[j] > key) { arr[j + 1] = arr[j]; } else { break; } } arr[j + 1] = key; } return arr; }; //4.希尔排序 function shellSort(arr) { if (arr.length < 2) { return arr; }; var n = arr.length; for (gap = Math.floor(n / 2); gap > 0; gap = Math.floor(gap /= 2)) { for (i = gap; i < n; ++i) { for (j = i - gap; j >= 0 && arr[j + gap] < arr[j]; j -= gap) { temp = arr[j]; arr[j] = arr[j + gap]; arr[j + gap] = temp; } } } return arr; }; //5.归并排序 function merge(left, right) { var result = []; while (left.length > 0 && right.length > 0) { if (left[0] < right[0]) { // shift()方法用于把数组的第一个元素从其中删除,并返回第一个元素的值 result.push(left.shift()); } else { result.push(right.shift()); } } return result.concat(left).concat(right); } function mergeSort(arr) { if (arr.length == 1) { return arr; } var middle = Math.floor(arr.length / 2), left = arr.slice(0, middle), right = arr.slice(middle); return merge(mergeSort(left), mergeSort(right)); } //6.快速排序 var quickSort = function(arr) { if (arr.length <= 1) { return arr; } var pivotIndex = Math.floor(arr.length / 2); var pivot = arr.splice(pivotIndex, 1)[0]; var left = []; var 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)); }; //算法效率比较 //--------------------------------------------------------------- //| 排序算法 | 平均情况 | 最好情况 | 最坏情况 | 稳定性 | //--------------------------------------------------------------- //| 冒泡排序 | O(n²) | O(n) | O(n²) | 稳定 | //--------------------------------------------------------------- //| 选择排序 | O(n²) | O(n²) | O(n²) | 不稳定 | //--------------------------------------------------------------- //| 插入排序 | O(n²) | O(n) | O(n²) | 稳定 | //--------------------------------------------------------------- //| 希尔排序 | O(nlogn)~O(n²) | O(n^1.5) | O(n²) | 不稳定 | //--------------------------------------------------------------- //| 归并排序 | O(nlogn) | O(nlogn) | O(nlogn) | 稳定 | //--------------------------------------------------------------- //| 快速排序 | O(nlogn) | O(nlogn) | O(n²) | 不稳定 | //---------------------------------------------------------------
多种排序算法整理
最近面试一直问到排序,老是各种搞混,特地来整理整理先盗用一张图:说明:内部排序基于内存,外部排序是数据量大,而内存与外存的相结合的排序一、插入排序 关键词:插入,将数字插入到一条已经排好序的有序表中... 查看详情
算法思想整理
排序算法内部排序外部排序内部排序:数据全部在内存中进行排序外部排序:数据量太大,不能一次在内存中进行排序,因此,在排序的过程中需要使用到外部存储介质插入排序直接插入排序将一个数据插入到已经有序的序列中... 查看详情
内排序算法的整理(代码片段)
对各种内排序算法进行了整理,不足的日后补充。1.冒泡排序 冒泡排序属于交换排序,其基本思想是通过无序区中相邻元素关键字间的比较和位置的交换使关键字最小的元素如气泡一般逐渐往上“漂浮”至“水面”... 查看详情
排序算法整理
...659.html这个里面比较详细。主要记快排和归并。快排:快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个... 查看详情
自己整理的排序算法之选择排序
1//选择排序2packagesort;34publicclassSelectionSort{5publicstaticvoidSelectionSort(double[]list){6for(inti=0;i<list.length-1;i++){7doublecurrentMin=list[i];8intcurrentMinIndex=i;910for(intk=i+1;k<lis 查看详情
自己整理的算法快速排序
packagesort;publicclassQuickSort{ publicstaticvoidquickSort(int[]list){ quickSort(list,0,list.length-1); } //注意这里是private privatestaticvoidquickSort(int[]list,intfirst,intlast){ //这里有一个if条件别忘了 if( 查看详情
常见排序算法整理总结
排序排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不... 查看详情
自己整理的算法归并排序
packagesort;publicclassMergeSort{ publicstaticvoidmergeSort(int[]list){ if(list.length>1){ int[]firstHalf=newint[list.length/2]; System.arraycopy(list,0,firstHalf,0,list.length/2); mergeSort 查看详情
算法4整理(代码片段)
算法41.排序选择排序:每次获取最大的数,交换位置插入排序:把数字插入有序数组中希尔排序:有间隔并且间隔递减的归并排序:归并:两个有序数组的合并成新的有序数组自顶向下的归并排序:递归向下合并数组子底向上的归并排序:... 查看详情
数据结构学习笔记(八大排序算法)整理与总结(代码片段)
数据结构学习笔记(八大排序算法)整理与总结排序的相关概念排序的思想和实现插入排序直接插入排序折半插入排序希尔排序选择排序直接选择排序堆排序交换排序冒泡排序快速排序归并排序基数排序总结参考博客排... 查看详情
数据结构学习笔记(八大排序算法)整理与总结(代码片段)
数据结构学习笔记(八大排序算法)整理与总结排序的相关概念排序的思想和实现插入排序直接插入排序折半插入排序希尔排序选择排序直接选择排序堆排序交换排序冒泡排序快速排序归并排序基数排序总结参考博客排... 查看详情
自己整理的算法希尔排序
packagesort;/**希尔排序的原理:根据需求,如果你想要结果从小到大排列,它会首先将数组进行分组,然后将较大值移到前面,较小值*移到后面,最后将整个数组进行插入排序,这样比起一开始就用插入排序减少了数据交换和移动... 查看详情
快速排序思路整理
引言:快速排序和归并排序是面试当中常常被问到的两种排序算法,在研究过数据结构所有的排序算法后,个人认为最复杂的当属快速排序。从代码量上来看,快速排序并不多,我之所以认为快排难以掌握是因为快排是一种递归... 查看详情
各大排序算法再次整理——冒泡排序
冒泡排序/*原理是相邻的数两两交换,按照从小到大或者从大到小的顺序进行交换,这样一趟过去后,最大或最小的数字被交换到了最后一位,然后再从头开始进行两两比较交换,直到倒数第二位时结束;*/#include<stdio.h>#include<iost... 查看详情
算法--排序--分治与快速排序
学习排序算法也有一段时间,一直没有好好整理下排序算法的相关知识,排序在算法中是最基础也是最重要的,所以有必要自己进行一番整理,在提高领悟算法本质的同时以备以后自己复习,顺便也将自己领悟到的一些思想进行... 查看详情
自己整理的算法堆排序
packagesort;//最大堆的特性是,某个节点的值最多和其父节点的值一样大。这样,堆中的最大元素存放在根节点中//;并且,在以某一个节点为根的子树中,各节点的值都不大于该子树根节点的值publicclassHeapSort{publicstaticvoidheapSort(in... 查看详情
数据结构常见的八大排序算法(详细整理)
...reader_share&utm_content=note&utm_source=weixin-friends 八大排序,三大查找是《数据结构》当中非常基础的知识点,在这里为了复习顺带总结了一下常见的八种排序算法。常见的八大排序算 查看详情
java排序算法折半堆希尔快速整理
试题1:折半查找折半查找是在有序表中,把待查找数据值与查找范围的中间元素值进行比较,会有三种情况出现: 1)待查找数据值与中间元素值正好相等,则放回中间元素值的索引... 查看详情