排序算法

110 阅读1分钟

复杂度分析

排序复杂度

冒泡排序

function bubble(arr){
	for(let i = 0; i < arr.length - 1; i++){
		for(let j = 0; j < arr.length - 1 - i; j++){
			if(arr[j] > arr[j+1]){
				[arr[j],arr[j+1]] = [arr[j+1],arr[j]]
			}
		}
	}
	return arr
}

选择排序

function selectionSort(arr){
	for(let i = 0; i < arr.length - 1; i++){
		for(let j = i + 1; j < arr.length; j++){
			if(arr[i] > arr[j]){
				[arr[i],arr[j]] = [arr[j],arr[i]]
			}
		}
	}
	return arr
}

插入排序

function insertionSort(arr){
	for(let i = 1; i < arr.length; i++){
		let temp = arr[i]
		let j = i - 1   //j是i的前一个坐标位置
		while(j >= 0 && temp < arr[j]){
			arr[j+1] = arr[j]
			j--
		}
		arr[j+1] = temp
	}
	return arr
}

快速排序

function quickSort(nums){
	function partition(arr,left,right){
		let temp = arr[left]
		while(left < right){
			while(left < right && arr[right] >= temp) right--;
			arr[left] = arr[right]
			while(left < right && arr[left] < temp) left++;
			arr[right] = arr[left]
		}
		arr[left] = temp
		return left
	}

	function recursive(arr,left,right){
		if(left >= right) return arr;
		let index = partition(arr,left,right)
		recursive(arr,left,index - 1)
		recursive(arr,index + 1,right)
	}

	recursive(nums,0,nums.length-1)
}


let arr1 = [3,3,8,3,5,-3]
console.log(arr1)    //[3,3,8,3,5,-3]
quickSort(arr1)
console.log(arr1)    //[-3,3,3,3,5,8]

归并排序

function mergeSort(nums){
	function merge(l1,r1,l2,r2){
		let arr = []
		let index = 0
		let i = l1
		let j = l2
		while(i <= r1 && j <= r2){
			arr[index++] = nums[i] > nums[j] ? nums[j++] : nums[i++]
		}
		while(i <= r1) arr[index++] = nums[i++];
		while(j <= r2) arr[index++] = nums[j++];
		for(let t = 0; t < index; t++){
			nums[l1+t] = arr[t]
		}
	}

	function recursive(left,right){
		if(left >= right) return
		let mid = Math.floor((left+right) / 2)
		recursive(left,mid)
		recursive(mid+1,right)
		merge(left,mid,mid+1,right)
		return nums
	}

	recursive(0,nums.length-1)

}