快速排序

来源:互联网 发布:网络语233333什么意思 编辑:程序博客网 时间:2024/05/24 07:03

算法——快速排序


@Author:云都小生


概述——理解快速排序



快速排序算法是一种比冒泡效率更高的算法,既剩时间有省空间。这个算法是由东尼霍尔提出的,后来有很多人进行了优化。

算法是这样的,一开始给定一个数列:{6,2,8,3,5,1,9,4,7,10}

开始的时候,我们选择一个数作为基准数,就选6吧。

接着,我们指定两个哨兵(i,j),它们一个指向这个数列的最左边,一个指向这个数列的最后边。

这里写图片描述

这个时候,先从右边开始,我们找到比6小的数,找到就停住,然后我们从左边开始找,找到比6大的数,找到就停住。接着我们交换他们的值。

这里写图片描述

直到这种情况:i==j 我们就直接吧a[i]/a[j]跟基准数交换,这个时候就已经把基数放到真正属于它的位置了。左边的数全部比它小,右边的数全部比它大。

这里写图片描述

接下来,只要重复上面的步骤,对左边和右边的数列进行排序就行了。


代码实现


import java.util.Arrays;public class Test{    public static void main(String[] args) {        int a[] = new int[]{6,2,8,3,5,1,9,4,7,10};        quicksort(a,0,a.length-1);        System.out.println(Arrays.toString(a));    }    public static void quicksort(int[] a,int left,int right)    {        int i,j,t,center;        //递归返回        if(left>right)        {            return;         }        center=a[left]; //center存的是基准数         i=left;         j=right;         while(i!=j)         {             //顺序很重要,要先从右边开始找             while(a[j]>=center && i<j)             {                 j--;            }            //再找右边的             while(a[i]<=center && i<j)             {                i++;            }            //交换两个数在数组中的位置(前提是i != j)             if(i<j)             {                 t=a[i];                 a[i]=a[j];                 a[j]=t;             }         }         //最终将基准数归位         a[left]=a[i];         a[i]=center;         quicksort(a,left,i-1);//继续处理左边的,这里是一个递归的过程         quicksort(a,i+1,right);//继续处理右边的 ,这里是一个递归的过程     }}

2017/10/30 16:34:36 @Author:云都小生