JS排序算法:冒泡、选择、插入、归并、快速、希尔、堆、计数

1. 冒泡排序算法实现(JAVAscript)
//冒泡排序算法(JavaScript)//author:Hengda//arr数组//modefalse 升序 ture 降序function bubbleSort( arr, mode ){var i, j, temp, len = arr.length;for( i = len - 1 ; i > 0; i-- ){for( j = 0; j < i; j++ ){if( mode ? arr[ j + 1 ] < arr[ j ] : arr[ j + 1 ] > arr[ j ] ){temp = arr[ j + 1 ];arr[ j + 1 ] = arr[ j ];arr[ j ] = temp;}}}return arr;}2. 计数排序算法实现(javascript)
//计数排序算法(javascript)//author:Hengda//arr数组//modefalse 升序 ture 降序function countingSort( arr, mode ){//i,j为控制变量,temp为交换变量,len为数组的长度var i, j, temp, len = arr.length;var countArr = [];//用于原始数组中统计各元素出现的次数var fillPos;//标记下一个回填位置var countArrLen;//计数数组的长度//统计for( i = 0; i < len; i++ ){if( countArr[ arr[ i ] ] != null ){countArr[ arr[ i ] ] ++;}else{countArr[ arr[ i ] ] = 1;}}//将数据重新排列回填到原始数组中//统计var fillPos = 0;//回填起始位置var countArrLen = countArr.length;if( mode ){//for( i = countArrLen - 1; i >=0; i-- ){//if( countArr[ i ] != null ){//回填countArr[ i ]个当前值i到原始数组,回填起始位置为fillPosfor( j = 0; j < countArr[ i ]; j++ ){arr[ fillPos++ ] = i;}}}}else{//for( i = 0; i < countArrLen; i++ ){//if( countArr[ i ] != null ){//回填countArr[ i ]个当前值i到原始数组,回填起始位置为fillPosfor( j = 0; j < countArr[ i ]; j++ ){arr[ fillPos++ ] = i;}}}}//排序完成return arr;}3. 堆排序算法实现(javascript)
//功能:堆排序(javascript)//author:Hengda//arr:待排序数组//mode:true 从大到小排序,false 从小到大排序function heapSort( arr, mode ){var len = arr.length;//数组的长度var temp;//用于交换节点值var endHeapNodeNo;//堆末尾节点在数组中的下标//将数组调整为二叉堆for( var i = Math.floor( len / 2 ) - 1; i >= 0; i-- ){heapNodeSink( arr, i, len, mode );}for( var heapLen = len; heapLen > 0; heapLen-- ){endHeapNodeNo = heapLen - 1;//堆的最后一个节点的序号//交换堆顶和堆尾元素temp = arr[ endHeapNodeNo ];arr[ endHeapNodeNo ] = arr[ 0 ];arr[ 0 ] = temp;//对除了堆尾元素组成的堆进行堆顶下沉操作heapNodeSink( arr, 0,heapLen - 1, mode );}return arr;}//堆中某节点按升序或者降序递归下沉//author:Hengda//arr:待排序数组//nodeNo:二叉树中指定节点的序号/堆数组中的下标//heapLen:堆的长度//mode:true 大的下沉,false 小的下沉function heapNodeSink( arr, nodeNo, heapLen, mode ){var leftChild = ( nodeNo + 1 ) * 2 - 1; //做孩子var rightChild = leftChild + 1;//右孩子var maxminNo = nodeNo;//最大值的序号var temp;//用户变量值得交换if( mode ){//if( heapLen > leftChild && arr[ maxminNo ] > arr[ leftChild ] ){maxminNo = leftChild;//更新最大节点序号}if( heapLen > rightChild && arr[ maxminNo ] > arr[ rightChild ] ){maxminNo = rightChild;//更新最大节点序号}}else{if( heapLen > leftChild && arr[ maxminNo ] < arr[ leftChild ] ){maxminNo = leftChild;//更新最大节点序号}if( heapLen > rightChild && arr[ maxminNo ] < arr[ rightChild ] ){maxminNo = rightChild;//更新最大节点序号}}//最大值所在节点有变化,则交换if( maxminNo != nodeNo ){//交换temp = arr[ maxminNo ];arr[ maxminNo ] = arr[ nodeNo ];arr[ nodeNo ] = temp;//继续下沉操作heapNodeSink( arr, maxminNo, heapLen, mode );}}4. 插入排序算法实现(javascript)
//插入排序算法(javascript)//算法原理//author:Hengda//2020/1/25//arr 待排序数组//mode true 从大到小排列,false 从小到大排列function insertionSort( arr, mode ){var i, j, temp, len = arr.length;//len为待排序数组长度 temp为交换变量 i j为控制变量 。//从数组的第二个元素开始逐个往后处理 。for( i = 1; i < len; i++ ){//将当前被处理元素值记录下来 。temp = arr[ i ];//以下标倒序逐一比较当前元素位置之前的所有元素,如果比当前元素大,则逐一向后覆盖一个元素 。for( j = i - 1; j >= 0 && ( mode ? arr[ j ] < temp : arr[ j ] > temp ); j-- ){arr[ j + 1 ] = arr[ j ];}//将点前被处理元素的值填入最终空缺的位置即 (j + 1) 注意这个 j 已经被for循环做了-1操作,所以这里需要+1 。arr[ j + 1 ] = temp;}//遍历完成后,整个数组即为有序数组 。return arr;}5. 归并排序算法实现(javascript)
//归并排序算法(javascript)//author:Hengda//arr数组//start 数组中待排序段落的起止位置,len为数据段的长度//modefalse 升序 ture 降序function mergeSort( arr, start, len ,mode){var i, j, temp;//计算左侧数据段的位置和长度var lstart = start;var llen = Math.floor( len / 2 );//计算右侧数据段的位置和长度var rstart = lstart + llen;var rlen = len - llen;//分别对左右分段进行进行插入排序if( llen > 4 ) mergeSort( arr, lstart, llen );if( rlen > 4 ) mergeSort( arr, rstart, rlen );//对当前数据段进行插入排序for( i = start + 1; i < len + start; i++ ){temp = arr[ i ];for( j = i - 1; j >= start && ( mode ? arr[ j ] < temp : arr[ j ] > temp); j-- ){arr[ j + 1 ] = arr[ j ];}arr[ j + 1 ] = temp;}return arr;}


推荐阅读