快速排序

1.快速排序的基本思想

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

快速排序的具体算法步骤:
(1)首先设定一个分界值,通过该分界值将数组分成左右两部分。
(2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值。
(3)然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。
(4)重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。

2.partition算法解析

partition算法使用头尾两个方向相反的指针进行遍历,先将数组第一个元素设置为比较元素,头指针从左至右找到第一个大于比较元素的数,尾指针从右至左找到第一个小于比较元素的数,全部交换完毕后将比较元素放到中间位置。

代码的实现:

//快速排序partition实现方法
public class T2 {
    public static void main(String args[])
    {
        int a[] = {5,7,1,6,4,8,3,2};
        quicksort(a, 0, a.length-1);
        for(int i=0;i<a.length;i++)
            System.out.print(a[i] + " ");
        System.out.println();
    }

    public static void swap(int a[], int i, int j)
    {
        int t = a[i];
        a[i] = a[j];
        a[j] = t;
    }

    //划分数组
    public static int partition(int a[], int low, int high)
    {
        int x = a[low];    //将该数组第一个元素设置为比较元素
        int i=low;
        int j=high;
        while(i < j)
        {
            while(i<j && a[j] >= x)
                j--;     //从右至左找到第一个小于比较元素的数
            while(i<j && a[i] <= x)
                i++;     //从左至右找到第一个大于比较元素的数
            /*需要注意的是,这里的j--与i++的顺序不可以调换!
             *如果调换了顺序,i会走过头,以至于将后面较大的元素交换到数组开头*/

            //将大数与小数交换
            if(i!=j)
                swap(a, i, j);
        }
        swap(a, i, low);    //将比较元素交换到期望位置
        return i;     //返回比较元素的位置
    }

    public static void quicksort(int a[], int low, int high)
    {
        if(low < high)
        {
            int i = partition(a, low, high);    //划分数组并获取比较元素的位置
            quicksort(a, low, i-1);     //对比较元素左边进行排序
            quicksort(a, i+1, high);     //对比较元素右边进行排序
        }
    }
}

 

posted @ 2021-03-17 23:27  sxj498  阅读(71)  评论(0)    收藏  举报