js中的基础排序算法
var arr = [6,4,9,8,7,3,1,6];
1、内置的sort排序:
function sort (arr) { return arr.sort(function(a,b) { return a-b; }) }
2、冒泡排序:
function bubbleSort(arr) { var len = arr.length; var temp; for (var i=0;i<len-1;i++) { for (var j=0;j<(len-i)-1;j++) { //len-i是因为i为已排好的个数,已排好的位置不用继续判断,-1是最后一位已经排好最大的数,不用处理。 console.log(i,j,arr[j], arr[j+1]) if (arr[j] > arr[j+1]) { temp = arr[j+1]; arr[j+1] = arr[j]; arr[j] = temp; } console.log(arr) } } return arr; }
3、快速排序:
function quickSort(arr) { if (arr.length <= 1) { return arr; } var pivotIndex = Math.floor(arr.length/2); // var pivot = arr[pivotIndex]; var pivot = arr.splice(pivotIndex,1)[0]; var left = []; var right = []; var len = arr.length; for (var i=0;i<len;i++) { if (arr[i] < pivot) { left.push(arr[i]); } else { right.push(arr[i]); } } return quickSort(left).concat([pivot],quickSort(right)); }
4、选择排序:
function selectionSort (arr) { var len = arr.length; var temp,minIndex; 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[i]; arr[i] = arr[minIndex]; arr[minIndex] = temp; } return arr; }
5、插入排序:
function insertionSort (arr) { var len = arr.length; var preIndex,current; for (var i=1;i<len;i++) { preIndex = i-1; current = arr[i]; while (preIndex >= 0 && arr[preIndex] > current) { //循环判断满足条件的情况 console.log(preIndex, current, arr) arr[preIndex+1] = arr[preIndex]; //如果在前面的数寻找到大于current的就将前面的这个数往后移动一位 preIndex--; //继续往前寻找有没有小于current的数 } arr[preIndex+1] = current; // 寻找完所有前面满足条件的数后,将current数放到最后一次往后移动的数的原始位置(因为while里preIndex做了- -处理,所以这里需要+1才是原始位置) } return arr; }
6、归并排序:
function mergeSort(arr) { // 采用自上而下的递归方法 var len = arr.length; if(len < 2) { return arr; } var middle = Math.floor(len / 2), left = arr.slice(0, middle), right = arr.slice(middle); console.log('mergeSort', left, right) // var paramsLeft = mergeSort(left); // var paramsRight = mergeSort(right); return merge(mergeSort(left), mergeSort(right)); //mergeSort(left)和mergeSort(right)先将left和right的顺序排列好,最后再将排列好的left和right merge处理 // return merge(paramsLeft, paramsRight); } function merge(left, right) { console.log('merge', left, right) var result = []; while (left.length && right.length) { // 循环判断,当一边的数据被处理完后不再对两边数据进行对比 if (left[0] <= right[0]) { result.push(left.shift()); } else { result.push(right.shift()); } } while (left.length) //将剩下的数据依次保存到result后面 result.push(left.shift()); while (right.length) //将剩下的数据依次保存到result后面 result.push(right.shift()); console.log('merge', result) return result; } console.log(mergeSort(test))
。。。。。。