排序之快速排序算法

来源:互联网 发布:免费办公用品软件系统 编辑:程序博客网 时间:2024/06/06 04:05

快排是在实际中最常用的一种排序算法,速度快,效率高。所以在开发的过程中,经常使用到;在面试的时候,也会经常考到。
快排的思想是分治思想。例子是最好的老师,我们就在实际的例子中理解快排吧。
首先定义一个数组{6, 2, 5, 3, 8, 1,10,12,4,7},对它进行排序.

  • 先从数列中取出一个数作为基准数(key),我们就先第一个数吧,就6.
  • 首先设置两个游标,left = 0,right =9(即把两个游标指向数组的两头)。
  • 再把array[right]和key作比较,发现array[right]>key,right- -.
  • 然后继续比较array[right]和key,发现4<6,此时就更换array[right]和array[left]的值.再left++.[4,2,5,3,8,1,10,12,6,7]。right = 8,left = 1;
  • 再次比较array[left]和key的值,2<6,不变,left++;right = 8,left = 2;
  • 再次比较array[left]和key的值,5<6,left++;right = 8,left = 3.
  • 再次比较array[left]和key的值,3<6,left++;right = 8,left = 4.
  • 此时比较array[left]和key的值,8>6,交换array[right]和array[left]的值。[4,2,5,3,6,1,10,12,8,7],right- -;right = 7,left = 4.
  • 重复上面的步骤,直到right = left.此时[4,2,5,3,1,6,10,12,8,7],right = left = 5.现在在array[5]左边的数都比array[5]小,array[5]右边的数都比array[5]大,这就完成了第一次循环。
  • 对array[5]左边的和右边的数组分别重复上述步骤。直到排序完成。

快排的思想是选择一个数作为基准(key),遍历数组,把比这个key大的放到key右边,比key小的放到key左边。然后再对key值左边和右边的数组分别再次进行排序,直到排序完成。
它的时间复杂度:O(nlgn).
下面是java代码:

public class Main {    static int[] sortedArray = {6, 2, 5, 3, 8, 1};    public static void main(String[] args) {        sort(sortedArray, 0, sortedArray.length - 1);        for (int i = 0; i < sortedArray.length; i++)            System.out.print(sortedArray[i] + ",");    }    private static void sort(int[] array, int left, int right) {        //当左边cursor大于或者等于右边的cursor时,说明左右游标已经碰头了,此时应该结束此次循环排序。        if (left >= right)            return;        int key = array[left];        int leftCursor = left;        int rightCursor = right;        while (leftCursor < rightCursor) {            //先从右边的cursor往左边移动,直到当找到比key小的数的时候或者当左右游标碰头的时候结束循环            while (leftCursor < rightCursor && array[rightCursor] > key) {                rightCursor--;            }            //此时找到了比key小的数(或者leftCursor == rightCursor,这种情况下面执行了也没有影响)            //所以把右游标的数移动到左游标那里(当第一次循环里,左游标的数此时和key一样)            array[leftCursor] = array[rightCursor];            //从左开始循环,原理和上面从右循环差不多,不同的就是此时找的是比key大的数            while (leftCursor < rightCursor && array[leftCursor] < key) {                leftCursor++;            }            array[rightCursor] = array[leftCursor];        }        //当运行到这里的时候,说明left=right,此时左右游标碰头,碰头后,把key还原        array[leftCursor] = key;        //这一次循环排序完成了,此时leftCursor = rightCursor,游标把数组分成了两部分,        //在array的左边,数字全比key小,右边的数字比key大,然后再对key左右的数字分别再次进行排序(递归)        sort(array, left, leftCursor - 1);        sort(array, leftCursor + 1, right);    }}
0 0
原创粉丝点击