javascript常见排序算法总结
来源:互联网 发布:网络社会零售额 编辑:程序博客网 时间:2024/06/11 13:30
javascript常见排序算法总结
算法是程序的灵魂。虽然在前端的开发环境中排序算法不是很经常用到,但常见的排序算法还是应该要掌握的。我在这里从网上整理了一下常见排序算法的javascript实现,方便以后查阅。归并排序:
function merge(left, right){ var result = [], il = 0, ir = 0; while (il < left.length && ir < right.length){ if (left[il] < right[ir]){ result.push(left[il++]); } else { result.push(right[ir++]); } } return result.concat(left.slice(il)).concat(right.slice(ir)); }
function mergeSort(items){ // 结束条件: 数组元素少于2个 if (items.length < 2) { return items; } var middle = Math.floor(items.length / 2), left = items.slice(0, middle), right = items.slice(middle); return merge(mergeSort(left), mergeSort(right)); }
function mergeSort2(items){ if (items.length < 2) { return items; } var middle = Math.floor(items.length / 2), left = items.slice(0, middle), right = items.slice(middle), params = merge(mergeSort(left), mergeSort(right)); params.unshift(0, items.length); items.splice.apply(items, params); return items; }
插入排序:
function insertionSort(items) { var len = items.length, value, i, j; for (i=0; i < len; i++) { value = items[i]; for (j=i-1; j > -1 && items[j] > value; j--) { items[j+1] = items[j]; } items[j+1] = value; } return items;}
选择排序:
function swap(items, firstIndex, secondIndex){ var temp = items[firstIndex]; items[firstIndex] = items[secondIndex]; items[secondIndex] = temp; }
function selectionSort(items){ var len = items.length, min; for (i=0; i < len; i++){ min = i; for (j=i+1; j < len; j++){ if (items[j] < items[min]){ min = j; } } if (i != min){ swap(items, i, min); } } return items; }
冒泡排序:
function swap(items, firstIndex, secondIndex){ var temp = items[firstIndex]; items[firstIndex] = items[secondIndex]; items[secondIndex] = temp; }
function bubbleSort(items){ var len = items.length, i, j, stop; for (i=0; i < len; i++){ for (j=0, stop=len-i; j < stop; j++){ if (items[j] > items[j+1]){ swap(items, j, j+1); } } } return items; }
快速排序:
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));};
二分法查找:
function binarySearch(items, value){ var startIndex = 0, stopIndex = items.length - 1, middle = Math.floor((stopIndex + startIndex)/2); while(items[middle] != value && startIndex < stopIndex){ if (value < items[middle]){ stopIndex = middle - 1; } else if (value > items[middle]){ startIndex = middle + 1; } middle = Math.floor((stopIndex + startIndex)/2); } return (items[middle] != value) ? -1 : middle; }
基数排序:
var countSort = function(array) { var i, z = 0, count = [], min = Math.min.apply({}, array), max = Math.max.apply({}, array), size = array.length; //给新数组预填为零 for (i = min; i <= max; i++) { count[i] = 0; } for (i=0; i < size; i++) { count[array[i]]++; } for (i = min; i <= max; i++) { while (count[i]-- > 0) {//循环新数组,如果不为零,则把i返回array array[z++] = i; } } return array; }
希尔排序:
function shellSort(array) { var j, i, v, h=1, s=3, k,n = array.length; var result = ""; var count = 0; while(h < n) h=s*h+1; while(h > 1) { h=(h-1)/s; for (k=0; k<h; k++) for (i=k+h,j=i; i<n; i+=h, j=i) { v=array[i]; while(true) if ((j-=h) >= 0 && array[j] > v) array[j+h]=array[j]; else break; array[j+h]=v; } count++; result += "<br />第" + count + "遍排序的结果是:"; for (var n = 0; n < array.length; n++) { result += array[n] + ","; } } return result;}
组合排序:
var combSort = function(array){ var gap = array.length; do{ gap = gap * 10 / 13 if(gap === 9 || gap === 10) gap = 11 if(gap < 1){ gap = 1 } var swapped = false; for(var i=0;i<array.length-gap;i++){ var j = i + gap if(array[i]>array[j]){ var temp = array[i]; array[i] = array[j]; array[j] = temp; test(array) swapped = true } } if(gap == 1 && !swapped){ break; } }while(1); }
鸡尾酒排序:
var cocktailSort= function(array) { var top = array.length - 1, bottom = 0,flag = true,i, j; while (flag) { flag = false; //从左到右到大,把最大的放到每次范围的最右边 for (i = bottom; i < top; i++) { if (array[i] > array[i + 1]) { swap(array, i, i + 1); flag = true; } } top--; //从右到到左,把最小的放到每次范围的最小边 for (j = top; j > bottom; j--) { if (array[j] < array[j - 1]) { swap(array, j, j - 1); flag = true; } } bottom++; }} var swap = function(array,a,b){ var tmp = array[a]; array[a] = array[b] array[b] = tmp;}
转自:http://www.cnblogs.com/chenguangyin/archive/2012/11/19/2777757.html
- javascript常见排序算法总结
- 常见排序算法总结
- 常见排序算法总结
- 常见排序算法总结
- 常见排序算法总结
- 常见排序算法总结
- 常见排序算法总结
- 常见排序算法总结
- 常见排序算法总结 .
- 常见排序算法总结
- 常见排序算法总结
- 常见排序算法总结
- 常见排序算法总结
- 常见排序算法总结
- 常见排序算法总结
- 常见排序算法总结
- 常见排序算法总结
- 常见排序算法总结
- ContentProvider
- Ubuntu下ARM交叉编译环境配置
- 互联网营销我们应该怎么留住顾客?
- POJ 4273 Drainage Ditches
- Artifactory管理内部maven仓库 科普 详解
- javascript常见排序算法总结
- 解决asmack在android上收发文件的negotiating stream问题
- 互联网新闻营销的三个重要点
- Notification及NotificationManager的使用详解
- meta标记用于定义文件信息
- MFC在对话框中实现打印预览
- CSS3 Gradient
- S3C6410启动模式介绍
- Android的Logcat命令详解