算法篇---排序

149 阅读1分钟

算法采用javascript实现

冒泡排序

//最坏时间复杂度为 O(n²),假设有5个数,循环次数为 4 + 3 + 2 + 1,即n(n+1)/2次(n+1为元素个数)
function bubbleSort(arr) {
	//保证输入类型,且数组长度不小于1
	if(!Array.isArray(arr) || arr.length < 1) {
		return
	}

	//交换数组两个元素的值
	let swap = (arr, i, j) => {
		[arr[i], arr[j]] = [arr[j], arr[i]];
	}
	
	for(var i = 0; i< arr.length -1; i++){
		var flag = true; //定义此轮循环是否发生调序操作
	
		//开始一轮冒泡, j < arr.length -1 -i 末尾元素是已经完成的冒泡轮次产生的固定值,不需要重新比了
		for(var j = 0; j < arr.length -1 -i; j++){
	
			if(arr[j] > arr[j+1]){
				swap(arr, j,j+1)
				flag = false;
			}
		}
		//当这轮冒泡没对改变过元素顺序,那就说明排好了,即可以结束循环了
		if(flag){
			break;
		}
	}
}

插入排序

//最坏时间复杂度为 O(n²) 假设有5个数,则循环次数为  1 + 2 + 3 + 4
function insertSort(arr) {
	//保证输入类型,且数组长度不小于1
	if(!Array.isArray(arr) || arr.length < 1) {
		return
	}

	//交换数组两个元素的值
	let swap = (arr, i, j) => {
		[arr[i], arr[j]] = [arr[j], arr[i]];
	}

	for(var i = 1; i< arr.length; i++) {
		var j =i;

		//向前去比较,当还有前一个元素且当前元素还是小于前一个元素时交换一下。 j变小,但arr[j]的值一直没变
		while(j-1 >= 0 && arr[j] < arr[j - 1]){
			 swap(arr,j,j-1);
                j--;
		}

	}

}

//实现indexOf方法,取出第一个相同值的下标
function indexOf(arr, val){
	if(!Array.isArray(arr)){
		return
	} 

	for(let i =0; i< arr.length; i++){
		if(arr[i] === val){
			return i
		}
	}

	return -1
}

选择排序

function selectorSort(arr) {
	//保证输入类型为数组
	if(!Array.isArray(arr)){
		return
	} 

	//交换数组两个元素的值
	let swap = (arr, i, j) => {
		[arr[i], arr[j]] = [arr[j], arr[i]];
	}

	//坑位号循环
	for(var i = 0; i< arr.length-1; i++){
		var min  = i; //当前位置的最小数的下标,默认就是原位置数的下标

		//当前坑位下所需的最小元素下标
		for(var j = i+1; j < arr.length; j++){
			if(arr[j] < arr[min]){
				min = j
			}
		}

		//如果下标变了,则换位
		if(min !== i){
			swap(arr,min,i)
		}
	}
}

数组去重

function unique(arr){
	//保证输入类型为数组
	if(!Array.isArray(arr)){
		return
	} 

	return arr.reduce((pre, cur, index, arr) => {
		if(!pre.includes(cur)){
			return pre.concat(cur)
		}else {
			return pre
		}
	}, [])
}

->>> 博客原文 <<<-