Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

快速排序 #2

Open
shaodahong opened this issue Feb 27, 2017 · 8 comments
Open

快速排序 #2

shaodahong opened this issue Feb 27, 2017 · 8 comments
Labels

Comments

@shaodahong
Copy link
Owner

shaodahong commented Feb 27, 2017

快速排序

引自wikipedia 快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),一种排序算法,最早由东尼·霍尔提出。在平均状况下,排序n个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n)算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。

步骤

  1. 找到该数组的基准点(中间数),并创建两个空数组left和right;
  2. 遍历数组,拿出数组中的每个数和基准点进行比较,如果比基准点小就放到left数组中,如果比基准点大就放到right数组中;
  3. 对数组left和right进行递归调用。

方法一

function quickSort(arr) {
	if (arr.length <= 1) {return arr;}
	var left = [],
		right = [],
		baseDot = Math.round(arr.length / 2),
		base = arr.splice(baseDot, 1)[0];

	for (var i = 0; i < arr.length; i++) {
		if (arr[i] < base) {
			left.push(arr[i])
		}else {
			right.push(arr[i])
		}
	}

	return quickSort(left).concat([base], quickSort(right));
}

实现一个quickSort的封装,并且定义left和right,找到数组的基准点baseDot和对应的基数base,然后遍历数组的每一项和base进行对比,最后递归调用,给出一个跳出条件if (arr.length <= 1) {return arr;}

方法二

function quickSort(array, left, right) {
	var length = array.length;
		left = typeof left === 'number' ? left : 0,
		right = typeof right === 'number' ? right : length-1;

    if (left < right) {
        var index = left - 1;
        for (var i = left; i <= right; i++) {
            if (array[i] <= array[right]) {
                index++;
                var temp = array[index];
                array[index] = array[i];
                array[i] = temp;
            }
        }
        quickSort(array, left, index - 1);
        quickSort(array, index + 1, right);
    }
    return array;
}

快速排序的基本思想就是分治法

引自wikipedia 在计算机科学中,分治法是建基于多项分支递归的一种很重要的算法范式。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。

@zhilidali
Copy link

不觉得图有点不对吗

@zhilidali
Copy link

var length = array.length;
left = typeof left === 'number' ? left : 0;
right = typeof right === 'number' ? right : length-1;

@shaodahong
Copy link
Owner Author

@zhilidali 好的,我改正下

@shaodahong
Copy link
Owner Author

@zhilidali 图已改正

@zhuzhushang
Copy link

没有java的吗

@shaodahong
Copy link
Owner Author

@zhuzhushang 没有,我不熟悉java

@clone123
Copy link

clone123 commented Nov 1, 2017

楼主这头像。。。我喜欢。。

@shaodahong
Copy link
Owner Author

@clone123 大兄弟不搞基

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

4 participants