【JavaScript】JS排序算法-冒泡、插入、快速

JS六座大山:

  • 堆栈内存和闭包作用域
  • 面向对象oop程序设计:深浅拷贝
  • 同步异步编程及浏览器渲染机制:渲染机制、同步异步、CRP、微任务宏任务
  • DOM事件和设计模式
  • ES6核心知识和源码分析:
  • AJAX/http前后端数据通信:跨域、性能优化、、

进阶:

  • 数据结构与算法:排序、去重
  • H5响应式布局
  • Canvas和数据可视化
  • 正则表达式深入剖析
  • 企业OA办公系统

阶段二:
webpack工程化开发
Vue2.0
Vue生态进阶
Vue实战和性能优化
Vue3.0基础和实战
React基础、核心、生态、实战、性能
小程序
Node、express
Flutter


算法:时间复杂度
O(1)

算法:主要基于数组的去重和排序;

排序:冒泡、插入、快速(好)
冒泡排序(O(n^2)):前一个跟后一个比大小,一轮过后最大的排到最后去;

  • 比较arr.length-1次;
  • 每次比较arr.length-1-i次
  • 交换两值:第三方变量temp、数组解构赋值[a,b]=[b,a]a=a+b;b=a-b;a=a-b;
// 按索引交换两值
function swap(arr, i, j) {
     
  let temp = arr[i];
  arr[i] = arr[j];
  arr[j] = temp;
  return arr;
}
// 冒泡排序
Array.prototype.bubble = function bubble() {
     
  let _this = this,
  flag = false;
  for (let i = 0; i < _this.length - 1; i++) {
     
    for (let j = 0; j < _this.length - 1 - i; j++) {
     
      if (_this[j] > _this[j + 1]) {
     
        swap(_this, j, j + 1);
        flag = true;
      }
    }
    if(!flag)break;//本次没有交换,就退出外层for循环
    flag=false;//本轮有交换,flag=true,所以回到默认值false,检测下次
  }
  return _this;
};
let arr = [2, 3, 6, 1, 7];
arr.bubble();
console.log(arr);//[1,2,3,6,7]

插入排序(O(n^2)):(返回新数组)(先拿出一张牌)抽取第一个数,构成新数组,剩下其他的挨个跟这个数组中数据比较,大于谁就放在谁后面;

Array.prototype.insert = function insert() {
     
	// 先取出一张牌放到手里
	let _this = this,
		hanlde = [];
	hanlde.push(_this[0]);
	// 开始抓牌
	for (let i = 1; i < _this.length; i++) {
     
		// A每一次新抓的牌
		let A = _this[i];
		// 和手里的牌进行比较(倒着比较)
		for (let j = hanlde.length - 1; j >= 0; j--) {
     
			// 要比较的手里这张牌
			let B = hanlde[j];
			// 新抓的牌A比B要大,则放在B的后面
			if (A > B) {
     
				hanlde.splice(j + 1, 0, A);
				break; //=>没必要和手里的牌继续比较了
			}
			// 都比到最开始,A都没有比任何的牌大,则A是最小的,插入到开始
			if (j === 0) {
     
				hanlde.unshift(A);
			}
		}
	}
	
	return hanlde;
};


let arr = [12, 8, 24, 16, 1];
arr = arr.insert();
console.log(arr);

快速排序(O(n+logn)):**(返回新数组)**类似的有堆排序;从数组中间取值,然后将剩下的跟这个值比较,大于的放到左边新数组中,小于放到右边新数组中,左右两个数组递归这个方法,直到数据为一个,最后拼接数组,成新的数组;

Array.prototype.quick = function quick() {
     
	let _this = this;

	// 如果处理的数组只有一项或者空的,则无需处理了
	if (_this.length <= 1) {
     
		return _this;
	}

	// 获取中间项,并且把中间项在数组中删除
	let middleIndex = Math.floor(_this.length / 2),
		middleValue = _this.splice(middleIndex, 1)[0];

	let arrLeft = [],
		arrRight = [];
	for (let i = 0; i < _this.length; i++) {
     
		let item = _this[i];
		item < middleValue ? arrLeft.push(item) : arrRight.push(item);
	}

	return quick.call(arrLeft).concat(middleValue, quick.call(arrRight));
};



let arr = [12, 34, 22, 54, 1];
arr = arr.quick();
console.log(arr);

你可能感兴趣的:(JavaScript,javascript)