一、排序算法的分类
1.插入类排序
军训时,在一只有序队伍中,新来一个,教官要求新来的迅速找到自己的位置。
例:直接插入排序、折半插入排序
2.交换类排序
军训刚开始,一群新生需要排队,教官说,“你比你旁边的高,你俩换一下,怎么换完还高,再换......”
例:冒泡排序、快速排序
3.选择类排序
每一趟选出最小(或最大)的一个。比如军训排队,教官说,“你们都别动,我看看谁个字最小,你和第一个换一下,剩下的我继续选......”
例:简单选择排序、堆排序
4.归并类排序
将两个或两个以上的有序序列合并成一个新的有序序列。继续军训排队,教官让每个人和旁边的人组成一个二人组,二人组内部先排好,二人组再和旁边的二人组组成新的四人组,依旧内部排序...... 最终会合并到一个组。
例:二路归并排序
5.基数类的排序
基于多关键字排序的思想。例如,一副去掉大小王的52张扑克牌进行基数排序,先按花色(红桃、黑桃、方片、梅花)排序,这样分成了4堆,然后每一堆从 A 到 K 排序。
二、JavaScript排序算法实现
1.直接插入排序
let arr = [49, 38, 65, 97, 76, 13, 27, 49] let i = 0 let temp, j let n = arr.length /*非递减排序*/ for (i+1; i<n; i++) { temp = arr[i] j = i-1 while (j>=0 && temp<arr[j]) { arr[j+1] = arr[j] --j } arr[j+1] = temp } console.log(arr) //[13, 27, 38, 49, 49, 65, 76, 97]
2.希尔排序
let arr = [49, 38, 65, 97, 76, 13, 27, 49, 55, 4] let gaps = [5, 3, 1] let i = 0, j = 0, n = 0, temp /*非递减排序*/ for (n; n<gaps.length; n++) { for (i=gaps[n]; i<arr.length; i++) { temp = arr[i] for (j=i; j>=gaps[n] && arr[j-gaps[n]]>temp; j=j-gaps[n]) { arr[j] = arr[j-gaps[n]] } arr[j] = temp }
}
3.冒泡排序
let arr = [49, 38, 65, 97, 76, 13, 27, 49, 55, 4] let i = 0 let j = 0 /*非递减排序*/ for (i; i<arr.length; i++) { for (j=i+1; j<arr.length; j++) { if (arr[i]>arr[j]) { let k = arr[i] arr[i] = arr[j] arr[j] = k } } }
4.快速排序
let arr = [49, 38, 65, 97, 76, 13, 27, 49, 55, 4] /*非递减排序*/ function quickSort (arr_) { let left =[] let right = [] let m, temp let i=0 if (arr_.length<=1) { return arr_ } m = Math.floor(arr_.length/2) temp = arr_.splice(m, 1) for (i; i<arr_.length; i++) { if (arr_[i]<temp) { left.push(arr_[i]) } else { right.push(arr_[i]) } } console.log('left:'+left) console.log('right:'+right) console.log('temp:'+temp) return quickSort(left).concat(temp, quickSort(right)) } console.log(quickSort(arr))
5.选择排序
let arr = [49, 38, 65, 97, 76, 13, 27, 49, 55, 4] let i = 0 let j = 0 let k, temp /*非递减排序*/ for (i; i<arr.length; i++) { min_ = arr[i] k = i for (j=i+1; j<arr.length; j++) { if (arr[j]<min_) { min_ = arr[j] k = j } } temp = arr[i] arr[i] = min_ arr[k] = temp } console.log(arr)
分类参考天勤计算机考研高分笔记系列第8版,2020版数据结构
JavaScript算法参考简书 https://www.jianshu.com/p/da9e31c485c2