JS 实现 快速排序 递归 非递归

递归

function quick(arr, left = 0, right = arr.length - 1) {
	if (left >= right) return;
	var i = left, j = right, flag = i;
	while(i < j) {
		while(arr[j] >= arr[flag] && j > flag) j --;
		if (i >= j) break;
		while(arr[i] <= arr[flag] && i < j) i ++;
		var temp = arr[flag];
		arr[flag] = arr[j];
		arr[j] = arr[i];
		arr[i] = temp;
		flag = i
	}
	quick(arr, left, flag - 1);
	quick(arr, flag + 1, right);
}

非递归

function quick(arr, left = 0, right = arr.length - 1) {
	var list = [[left, right]]; // 模拟栈
	while(list.length > 0) {
		var now = list.pop()
		if (now[0] >= now[1]) continue;
		var i = now[0], j = now[1], flag = i;
		while(i < j) {
			while(arr[j] >= arr[flag] && j > flag) j --;
			if (i >= j) break;
			while(arr[i] <= arr[flag] && i < j) i ++;
			var temp = arr[flag];
			arr[flag] = arr[j];
			arr[j] = arr[i];
			arr[i] = temp;
			flag = i	
		}
		list.push([now[0], flag - 1]);
		list.push([flag + 1, now[1]]);
	}
}

非常规

function quick(arr) {
	if (arr.length <= 1) return arr;
	var index = Math.floor(arr.length / 2),
		pviot = arr.splice(index, 1)[0],
		left = [],
		right = [],
		i = -1
	
	while (++i < arr.length) {
		if (arr[i] >= pviot) {
			right.push(arr[i])
		} else {
			left.push(arr[i])	
		}
	}
	return quick(left).concat(pviot, quick(right))
}

其中 递归调用在 数据量为 100w 左右时 会造成栈溢出

发布了7 篇原创文章 · 获赞 0 · 访问量 145

猜你喜欢

转载自blog.csdn.net/weixin_42685487/article/details/105435332
今日推荐