算法-排序

2 篇文章 0 订阅

冒泡排序

冒泡排序比较任何相邻的两个元素,如果第一个比第二个大,则交换他们,元素向上移动至正确的位置,像冒泡一样,因此而得名。复杂度O(n2)

function List(){
	// 辅助函数,交换元素位置
	function swap(id1, id2) {
		const aux = arr[id1];
		arr[id1] = arr[id2];
		arr[id2] = aux;
	}
	const arr = [];
	this.insert = (item) => {
		arr.push(item);
	}
	this.toString = () => {
		return arr.join(',');
	}
	this.BubbleSort = () => {
		const len = arr.length;
		for (let i = 0; i < len; i++) {
			for (let j = 0; j < len - 1; j++) {
				if (arr[j] > arr[j + 1]) {
					swap(j, j + 1);
				}
			}
		}
	}
	// 普通的冒泡排序当程序执行到外循环的第二轮时,已经有正确排序的元素。尽管如此,在后续比较中,他们还会进行着比较。
	// 优化后的冒泡排序,减少运行时间,跳过已排序的元素
	this.ModifiedBubbleSort = () => {
		const len = arr.length;
		for (let i = 0; i < len; i++) {
			for (let j = 0; j < len - 1 - i; j++) {
				if (arr[j] > arr[j + 1]) {
					swap(j, j + 1);
				}
			}
		}
	}
}

选择排序

选择排序是一种原址比较排序。选择数组中最小的值,将其放在第一位,再选择第二小的值,放在第二位,依次类推。

this.selectSort = () => {
	const len = arr.length;
	let indexMin; // 初始化最小值
	for (let i = 0; i < len - 1; i++) {
		indexMin = i; // 设置最小值
		for (let j = i; j < len; j++) {
			if (arr[indexMin] > arr[j]) { // 比较最小值
				indexMin = j;
			}
		}
		if (indexMin !== i) {
			swap(i, indexMin); // 交换位置
		}
	}
}

插入排序

插入排序每次排一个数组项,以此方式构建最后一个数组项。假定第一项已排序,接着和第二项进行比较,判断第二项是需要呆在原位还是排在第一项前面,接着和第三项进项比较,以此类推。

this.insertSort  = () => {
	const len  = arr.length;
	let j;
	let temp;
	for (let i = 1; i < len; i++) {
		j = i;
		temp = arr[i];
		while (j > 0 && arr[j - 1] > temp) {
			arr[j] = arr[j - 1];
			j--;
		}
		arr[j] = temp;
	}
}

归并排序

归并排序是一种分治算法。它将数组分为若干个小数组,直到每个小数组只有一个位置,然后将小数组归并为一个大数组,直到最后只有一个排序后的数组。

this.mergeSort = () => {
	arr = merSortRec(arr);
}
function mergeSordRec(arr) {
	const len = arr.length;
	if (len === 1) {
		return arr;
	}
	const index = Math.floor(len / 2);
	const left = arr.slice(0, index);
	const right = arr.slice(index, len);
	return merge(mergeSordRec(left), mergeSordRec(right));
}
function merge(left, right) {
	const result = [];
	let il = 0;
	let ir = 0;
	while (il < left.length && ir < right.length) {
		if (left[il] < right[ir]) {
			result.push(left[il++]);
		} else {
			result.push(right[ir++]);
		}
	}
	while (il < left.length) {
		result.push(left[il++]);
	}
	while (ir < right.length) {
		result.push(right[ir++]);
	}
	return result;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值