您的位置:首页 > Web前端 > JavaScript

js实现冒泡排序,快速排序,插入排序及原生sort的使用

2019-03-11 19:54 531 查看

1、冒泡排序

原理:数组中有n个数,比较相邻的两个数,如果后面的数小于前面的数,则两者交换。一轮完成后,此时最大的数据已经在最后,此时进行第二轮,确定倒数第二个数,依次几轮就可完成,如下图详解:

 

图中我们可以看出,我们仅需要arr.length-1轮,且每轮比较的次数也逐渐减少,代码如下:

[code]//冒泡排序,从小到大
var arr = [5, 7, 4, 8, 3];
//1 外层循环:控制比較的轮数,arr.length - 1轮
for (var i = 1; i < arr.length; i++) {
//2 内层循环:控制每一轮中比較的次数
//for (var j = 0; j < arr.length - i - 1; j++) {//需要设置var i = 0;
for (var j = 0; j < arr.length - i; j++) {//需要设置var i = 1;
//3 比較当前项和后项的大小关系,如果当前项大,进行交换即可
if (arr[j] > arr[j + 1]) {
var temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}

此时简单的冒泡排序完成了,但是如果数据仅需要一轮排序就已经达到想要的结果了,下面的几轮就没有必要了,所以需要对以上代码进行优化,原理就是当一轮中没有触发任何交换的时候,跳出排序即可,代码如下:

[code]//冒泡排序,从小到大
var arr = [5, 7, 4, 8, 3];
//1 外层循环:控制比較的轮数,arr.length - 1轮
for (var i = 1; i < arr.length; i++) {
//----用于记录,本轮中,发生交换的次数
var count = 0;
//2 内层循环:控制每一轮中比較的次数
//for (var j = 0; j < arr.length - i - 1; j++) {//需要设置var i = 0;
for (var j = 0; j < arr.length - i; j++) {//需要设置var i = 1;
//3 比較当前项和后项的大小关系,如果当前项大,进行交换即可
if (arr[j] > arr[j + 1]) {
var temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
//----进入到if中说明发生了交换,设置count++
count++;
}
}
//----当本轮中所有次的比較完毕后,判断
//如果count依然为0,说明排序完毕,将循环结束即可
if (count == 0) {
break;//跳出循环(结束当前循环的执行)
}
}

2、快速排序

原理:取数组中间位置的数据,跟所有数据比较,比该数小的放一新数组,大的放一新数组,使用递归,拼接数据,最后得到想要的数组

快速排序是由缺点的,它是不稳定的,如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面。

[code]//快速排序
function quickSort(arr) {
//判断数组长度,如果小于等于1的话,直接返回元素
if (arr.length <= 1) {
return arr;
}
var pivotIndex = Math.floor(arr.length/2),//获取数组中间位置的索引
pivot = arr.splice(pivotIndex, 1)[0],//获取中间数据
small = [],//比中间数小的
large = [];//比中间数大的
//遍历去除中间数据的数组,添加至相对应的数组里面
for (var i = 0; i < arr.length; i++) {
if (arr[i] < pivot) {
small.push(arr[i])
} else {
large.push(arr[i])
}
}
//使用递归直到数据拆分完成
return quickSort(small).concat([pivot], quickSort(large));
}

3、插入排序

原理:拿自己和前面的数比较,如果比自己大,让他依次往后移动一个位置,直到前面的数自己小,放入该位置。

[code]//插入排序
function insertionSort(arr) {
//便利数组
//从第二个开始
for (var i = 1; i < arr.length; i++) {
var key = arr[i];
var j = i - 1;
while (arr[j] > key) {
//比当前数大的依次向后移动
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = key;
}
return arr;
}

 4、js 自带的sort

详细介绍请参考w3school

 

[code]//升序
arr.sort(function (a, b) {
return a - b;
})
console.log(arr)
//降序
arr.sort(function (b, a) {
return a - b;
})

彩蛋:如果对各排序原理不是很理解的话,可下载《算法动画图解》APP查看,里面有详细步骤,在最下方可设置中文,方便使用。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐