1. 冒泡排序
/*
算法描述
1.比较相邻元素,若第一个大于第二个,交换他们。
2.重复第一步,最后的数将会最大。
3.重复以上步骤,除了最后一个数
4.继续重复以上步骤,直到没有任何一对数需要比较。
*/
function bubbleSort(arr) { //参数:数组;返回值。 var len = arr.length; for (let i = 0; i < len; i++) { for (let j = 0; j < len -1 - i; j++) { if (arr[j] > arr[j + 1]) { //相邻两个元素比较 let temp = arr[j + 1]; //元素交换 arr[j + 1] = arr[j]; arr[j] = temp; } } } return arr; //返回排完序数组 } alert(bubbleSort([21,78,15,36,59,11,34,25,13])); //11,13,15,21,25,34,36,59,78
2.快速排序
/*
快排算法描述
1.找基准点。
2.建立两个空数组。
3.arr中大于基准点放left,则反之。
4.left,基准点,right连接起来。
*/
function quicksort(arr) { //参数类型:数组;返回值,数组。 if (arr.length <= 1) { return arr; } var equally = Math.floor(arr.length / 2); //arr中间索引 var benchmark = arr.splice(equally,1); //arr中间值 var left = []; var right = []; for (var i = 0,len = arr.length; i < len; i++) { if (arr[i] < benchmark) { left.push(arr[i]); } else { right.push(arr[i]); } } return quicksort(left).concat([benchmark],quicksort(right)); //不断递归,最后都递归为一个数,然后拼接数组,返回排完序数组。 } alert(quicksort([21,81,12,85,31,97,18,2,87,75,3])); //output:2,3,12,18,21,31,75,81,85,87,97
3.选择排序
/*
算法描述
1.与第一个数比较,如果大于它,则交换位置
2.重复第一步,一遍循环,第一个数是最小值;
3.重复n-1次循环,OK。
*/
function selectSort(arr) { //参数:数组;返回值:数组。 var len = arr.length; var temp; for (var i = 0; i < len - 1; i++) { for (var j = j + 1; j < len; j++) { if (arr[j] < arr[i]) { //与第一个数比较 temp = arr[j]; //交换位置 arr[j] = arr[i]; arr[i] = temp; } } } return arr; //返回数组 } alert(selectSort([14,52,18,78,54,114,65,28,56])); //14,52,18,78,54,114,65,28,56
4.插入排序
/*
算法描述
1.第一个数a[0]与第二个数a[1]比较,若a[0] > a[1],则 a[1] = a[0]
2.关键是第三个数a[2],a[2]先与a[1],若a[2] < a[1],则交换位置,此时a[1]再与a[0]比较大小。
*/
function insertSort(arr) { //参数:数组;返回值:数组。 for (let i = 1,len = arr.length; i < len;i++) { for (let j = i - 1; j >= 0;j--) { //j--:若a[2] < a[1],指针退1。 if (arr[j] > arr[j + 1]) { //比较相邻两数大小 let temp = arr[j + 1]; arr[j + 1] = arr[j]; arr[j] = temp; } } } return arr; //返回数组 } alert(insertSort([12,85,42,67,34,56,19,97,47])); //12,19,34,42,47,56,67,85,97
5.归并排序
/*
算法描述
1.把arr分成left,right子序列;
2.比较left,right大小,返回排完序数组,递归两次;
3.递归与栈相关,弹出并返回的值执行其他动作。
*/
function mergeSort(arr) { //参数类型:数组;返回:数组。 if (arr.length < 2) { return arr; } const middle = Math.floor(arr.length / 2); //中间值 const left = arr.slice(0,middle); //left[] const right = arr.slice(middle); //right[] return merge(mergeSort(left),mergeSort(right)); //递归两次 } function merge(left,right) { var newArr = []; while (left.length && right.length) { if (left[0] < right[0]) { //子序列比较大小 newArr.push(left.shift()); } else { newArr.push(right.shift()); } } return newArr.concat(left,right); //返回合并好的了子序列 } alert(mergeSort([54,24,15,95,75,35,68,78,12,31,108])); //12,15,24,31,35,54,68,75,78,95,108