JavaScript快速排序

297 阅读1分钟

快速排序算法通过多次比较和交换来实现排序,其排序流程如下:

(1)首先设定一个分界值,通过该分界值将数组分成左右两部分。

(2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于分界值,而右边部分中各元素都大于或等于分界值。

(3)然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。

(4)重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了

function quickSort(arr, start = 0, end = arr.length){
	if(end === start) return
	
	if(end - start === 1){
		arr[end] >= arr[start] ? null : [arr[end], arr[start]] = [arr[start], arr[end]]
		return
	}
	// start mid end 排序
	let mid = start + parseInt((end - start) / 2)
	if(arr[mid] < arr[start]){
		[arr[mid], arr[start]] = [arr[start], arr[mid]]
	}
	if(arr[end] < arr[mid] && arr[end] >= arr[start]){
		[arr[end], arr[mid]] = [arr[mid], arr[end]]
	}else if(arr[end] < arr[start]){
		[arr[end], arr[mid]] = [arr[mid], arr[end]];// 这个冒号绝对不能去,不然和后面连在一起执行了
		[arr[start], arr[mid]] = [arr[mid], arr[start]]
	}
	[arr[mid], arr[end - 1]] = [arr[end - 1], arr[mid]]
	
	if(end - start === 2) return
	
	let left = start + 1, right = end - 2
	while(left !== right){
		if(arr[left] <= arr[end - 1]){
			left++
		}else{
			if(arr[right] >= arr[end - 1]){
				right--
			}else{
				[arr[left], arr[right]] = [arr[right], arr[left]]
			}
		}
	}
	
	if(arr[left] >= arr[end - 1]){
		[arr[end - 1], arr[left]] = [arr[left], arr[end - 1]]
	}else{
		[arr[end - 1], arr[left + 1]] = [arr[left + 1], arr[end - 1]]
		left++
	}
	quickSort(arr, start, left - 1)
	quickSort(arr, left + 1, end)
}