快速排序的java实现

来源:互联网 发布:2016年癌症数据 编辑:程序博客网 时间:2024/05/01 19:26
快速排序的java实现

package Sort;

/*

 * 简单的讲快速排序就是一个分治的过程

 * 此代码中以首个元素为基准,通过getPiv查找到基准元素的准确位置,将整个数组分成左边全是小于基准元素右边全是大于基准元素的数组

 * 递归对左边和右边的子数组进行快速排序

 */

public class QucikSort {

public static void quicksort(int arr[],int left,int right)

{   int pivo;

if(left<right)  //  这一个很重要,掉了这个犯了一个栈溢出的错误,其实只有当right-left>3时采用快排才是有效的

{

pivo=getPiv(arr,left,right);   //获得基准元素在数组中的准确位置

quicksort(arr,left,pivo-1);

quicksort(arr,pivo+1,right);

}

}

    public static int getPiv(int arr[],int left,int right)

    {

    int pivokey=arr[left];  //以首个元素作为基准元素

    while(left<right)   //  当left==right处,pivokey在数组中的准确位置找到

    {

    while(left<right && arr[right]>=pivokey)

    right--;   // 从右边开始查找第一个小于基准元素的元素位置

    if(left<right)

    {arr[left++]=arr[right];  //  将右边查找到的小于基准元素的元素移动到左边的left位置处,同时left++

    

    }

    while(left<right && arr[left]<=pivokey) 

    left++;    //  从左边的left开始查找第一个大于基准元素的元素位置

    if(left<right)

    {

    arr[right--]=arr[left];  // 将左边的大于基准元素的元素值移动到右边right处

    

    }

    }

    arr[left]=pivokey;  // pivokey移动到准确的位置,(left==right)

    return left;  //  同时返回基准元素的位置

    }

 

    public static void print(int ary[])  //  实现数组的输出

{

int n=ary.length;

for(int i=0;i<n-1;i++)

System.out.print(ary[i]+" ");

System.out.println(ary[n-1]);

}

public static void main(String args[])

{

int arr[]={3,5,7,9,6,4,2,1,8,10,13,16,15,14};

quicksort(arr,0,13);

print(arr);

}

}