一、图解排序过程
二、代码实现
三、完整代码
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><script>// 创建列表类function ArrayList() {// 属性this.array = []// 方法// 将数据可以插入到数组中的方法ArrayList.prototype.insert = function (item) {this.array.push(item)}ArrayList.prototype.toString = function () {return this.array.join('-')}// 交换两个位置的数据ArrayList.prototype.swap = function (m, n) {var temp = this.array[m]this.array[m] = this.array[n]this.array[n] = temp}// 实现排序算法// 冒泡排序ArrayList.prototype.bubbleSort = function () {// 1.获取数组的长度var length = this.array.length// 2.反向循环,因此次数越来越少for (var j = length - 1; j >= 0; j--) {// 第一次进来: i = 0, 比较 0 和 1 位置的两个数据,如果0位置大于 1位置的数据 交换两个的位置// 最后一次进来:i = length - 2, 比较length - 2 和 length - 1 的两个数据// 3.根据i的次数,比较到i的位置for (var i = 0; i < j; i++) {if (this.array[i] > this.array[i + 1]) {// 4.如果 i 位置比 i+1 位置的数据大,就交换位置// 前一个数字 > 后一个数字, 两者交换位置this.swap(i, i + 1)}}}}// 选择排序ArrayList.prototype.selectionSort = function () {// 1.获取数组的长度let length = this.array.length// 2.外层循环:从0位置开始取数据for (let j = 0; j < length - 1; j++) {// 内层循环,从i+1位置开始,和后面的数据进行比较let min = j // 最小值的下标for (let i = min + 1; i < length; i++) {if (this.array[min] > this.array[i]) {// 如果当前下标保存的最小值 > 当前遍历的项,// 说明当前遍历项才是最小的值,那么保存当前遍历项的下标min = i}}this.swap(min, j)}}// 插入排序ArrayList.prototype.insertionSort = function () {// 1.获取数组的长度let length = this.array.length// 2.外层循环:从第1个位置开始获取数据,向前面局部有序的部分进行插入for (let i = 1; i < length; i++) {// 3.内层循环:获取i位置的数字,和前面的数字依次进行比较,let temp = this.array[i]let j = i// 只要temp前面的数字比temp大并且temp前面的数字的下标>0// (因为就j=0的话进入循环,j--后下标变成了-1,所以要满足j>0才能进入循环),// 就把temp前面的数字往后移动1位while (this.array[j - 1] > temp && j > 0) {this.array[j] = this.array[j - 1] // 把大的数字往后挪j--}// 4.把比较的数据temp放到j位置this.array[j] = temp}}// 希尔排序// 快速排序}// 测试var list = new ArrayList()// 插入元素list.insert(66)list.insert(88)list.insert(12)list.insert(87)list.insert(100)list.insert(5)list.insert(566)list.insert(23)alert(list)// 验证冒泡排序// list.bubbleSort()// list.selectionSort()list.insertionSort()alert(list)
</script>
</body>
</html>