JS: 排序算法

本文介绍了JavaScript中的几种排序算法,包括冒泡排序、选择排序、插入排序、快速排序和归并排序。详细阐述了每种算法的工作原理,以及它们的时间复杂度和空间复杂度。冒泡排序通过相邻元素比较交换实现排序;选择排序通过找到最小元素置于首位;插入排序将数据分为有序和无序区逐步调整;快速排序通过分治策略达到平均O(nlogn)的时间效率;归并排序利用两次归并确保排序,时间复杂度为O(nlogn)但需要额外空间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

冒泡排序

依次比较两个相邻元素大小,如果顺序错误则交换位置,递归此操作。

function bubbleSort(data){
	var temp=0;
	for(var i=data.length;i>0;i--){
		//由于每次执行都会把最大的数移动到数组尾部,
		//所以每次循环长度减少1,避免不必要比较
		for(var j=0;j<i-1;j++){
			// 比较相邻元素
			if(data[j]>data[j+1]){
				//交换元素位置
				temp=data[j];
				data[j]=data[j+1];
				data[j+1]=temp;
			}
		}
	}
	return data;
}

选择排序

遍历找到数据中的最小元素置于首位,剩余元素递归此操作。

function selectionSort(data){
	for(var i=0;i<data.length;i++){
		var minValue=data[i];
		var minIndex = i;
		for(var j=i+1;j<data.length;j++){
			if(data[j]<minValue){
				minValue = data[j]
				minIndex = j;
			}
		}
		if(minIndex != i){
			var temp = data[i]
			data[minIndex]=temp;
			data[i]=minValue;
		}
	}
	return data
}

插入排序

将数据分为有序区和无序区两组,最初有序区只有一个元素,每次从无序区中选择一个元素,插入到有序区的位置,直到无序区变空。

function insertSort(data){
	// 将数组首尾分别作为有序区和无序区
	// 将数组第一个元素作为有序区初始元素
	for(var i=1;i<data.length;i++){
		// 从无序区选取元素,此处选取第一个
		var  temp=data[i];
		// j 为有序区最后一个(即值最大)元素下标
		var j=i-1;
		// 遍历有序区将选取的元素插入到正确位置
		while(j>=0&&data[j]>temp){
			data[j+1]=data[j];
			data[j] = temp
			j--;
		}
	}
	return data;
}

以上算法时间复杂度O(n2),空间复杂度O(1)

快速排序

将要数据分割成两组,其中一组所有数据比另外一组所有数据都小,对这两组数据分别递归此操作。

function quickSort(arr){
	if(arr.length<=1){
		return arr;
	}
	var left=[];
	var right=[];
	// 将数组任意元素作为比较对象,此处选取第一个
	var pivot=arr[0];
	for(var i=1;i<arr.length;i++){
		if(arr[i]<pivot){
			left.push(arr[i]);
		} else{
			right.push(arr[i]);
		}
	}
	return quickSort(left).concat(pivot,quickSort(right));
}

时间复杂度 平均O(nlogn)最坏O(n2),空间复杂度 平均O(logn)最坏O(n)

归并排序

将两个有序分段合并一个有序列表称为一次归并。
归并排序现将数组分为若干个有序分段,对分段进行归并递归,最终合并为一个有序表。

function mergeArr(arr1, arr2){
	//将两个有序数组合并成一个有序数组
	var arr = [];
	var i = 0, j = 0;
	while( arr1.length || arr2.length){
		// 分别从两个数组中取较小的值加入到新数组
		if(arr1[0] === undefined){ 
			// arr1已空,直接取arr2元素
			arr.push(arr2.shift());
		} else if(arr2[0] === undefined){
			// arr2已空,直接取arr1元素
			arr.push(arr1.shift());
		} else if(arr1[0] < arr2[0]){
			// arr1和arr2均不为空,取值较小的元素			
			arr.push(arr1.shift());
		} else {
			// 同上
		 	arr.push(arr2.shift());
		}
	}
	return arr;
}
function mergeSort(arr){
	// 将数组递归划分至元素仅有一个元素的数组,即可视为有序数组
	if(arr.length > 1){
		var mid = Math.ceil(arr.length/2);
		var arr1 = arr.slice(0,mid);
		var arr2 = arr.slice(mid)
		// 对划分后的数组进行合并
		return mergeArr(mergeSort(arr1), mergeSort(arr2));
	}
	return arr;
}

时间复杂度O(nlogn),空间复杂度O(n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值