赞
踩
主要操作:比较两个数据项、交换两个数据项或复制其中一项,具体操作要看排序的类型。
运行效率较低, 但是在概念上它是排序算法中最简单的,最适合初学的一种排序,具体思路为:
ArrayList.prototype.bubbleSort = function () { // 1.获取数组的长度 var length = this.array.length // 2.反向循环, 因此次数越来越少 for (var i = length - 1; i >= 0; i--) { // 3.根据i的次数, 比较循环到i位置 for (var j = 0; j < i; j++) { // 4.如果j位置比j+1位置的数据大, 那么就交换 if (this.array[j] > this.array[j+1]) { // 交换 this.swap(j, j+1) } } } } ArrayList.prototype.swap = function (m, n) { var temp = this.array[m] this.array[m] = this.array[n] this.array[n] = temp }
冒泡排序的效率为O(N²),比较次数为N²,交换次数也为N²
思路:
ArrayList.prototype.selectionSort = function () { // 1.获取数组的长度 var length = this.array.length // 2.外层循环: 从0位置开始取出数据, 直到length-2位置 for (var i = 0; i < length - 1; i++) { // 3.内层循环: 从i+1位置开始, 和后面的内容比较 var min = i for (var j = min + 1; j < length; j++) { // 4.如果i位置的数据大于j位置的数据, 那么记录最小的位置 if (this.array[min] > this.array[j]) { min = j } } // 5.交换min和i位置的数据 this.swap(min, i) } }
选择排序虽然效率也是O(N²),但在一定程度上优化了冒泡排序的效率,比较次数跟选择排序的效率一样都是O(N²),交换次数是O(N)。
插入排序是简单排序中效率最好的一种,也是学习其他高级排序的基础, 比如希尔排序/快速排序, 所以也非常重要。
思路:
ArrayList.prototype.insertionSort = function () { // 1.获取数组的长度 var length = this.array.length // 2.外层循环: 外层循环是从1位置开始, 依次遍历到最后 for (var i = 1; i < length; i++) { // 3.记录选出的元素, 放在变量temp中 var j = i var temp = this.array[i] // 4.内层循环: 内层循环不确定循环的次数, 最好使用while循环 while (j > 0 && this.array[j-1] > temp) { this.array[j] = this.array[j-1] j-- } // 5.将选出的j位置, 放入temp元素 this.array[j] = temp } }
插入排序对已经有序或基本有序的数据来说,效率高得多,它的效率还是O(N²),它的比较次数是选择排序的一半,所以这个算法效率是高于选择排序的。
希尔排序是插入排序的一种高效的改进版, 并且效率比插入排序要更快
插入排序的问题:当某个很小的数据比如1在最右端,要想把它放到正确的索引为0的位置,必须把每个前面的数据都向右移动一位,即比较和交换的次数都是N。
希尔排序就是在此基础上提出了一种不需要一个个移动所有中间数据项的算法,大致思路就是先将数据分成间隔比较大的分组进行排序,接着分成间隔小的分组进行排序,一步步缩小间隔,直到间隔为1。分完间隔排序后每次都让数据离自己正确位置更近了,间隔为1的排序就是插入排序了,此时大家都离自己正确的位置很近了,就不需要再对比交换那么多次数了,比如:
ArrayList.prototype.shellSort = function () { // 1.获取数组的长度 var length = this.array.length // 2.根据长度计算增量 var gap = Math.floor(length / 2) // 3.增量不断变量小, 大于0就继续排序 while (gap > 0) { // 4.实现插入排序 for (var i = gap; i < length; i++) { // 4.1.保存临时变量 var j = i var temp = this.array[i]
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。