[JAVA]快速排序

package sort_book_datastruction;

import java.util.ArrayList;
import java.util.Arrays;

/**
 * 快速排序:
 * 基本思想:通过一趟排序将待排序列分割成两部分,其中一部分记录的关键字比另一部分记录的关键字小,
 *        则可以分别对两部分记录继续进行排序,以达到整个序列有序;
 *        每一趟能够将枢轴元素放在正确的位置上。
 *具体做法:附设两个指针low和high,他们的初值分别是low和high,设枢轴记录的关键字为pivotkey,
 *       则首先从high所指的位置起向前搜索找到第一个关键字小于pivotkey的记录和枢轴互相交换,
 *       然后从low所指的位置起向后搜索,找到第一个关键字大于pivotkey的记录和枢轴互相交换,
 *       重复这两步,直至low=high为止;
 *改进:每交换一对记录需进行三次记录赋值操作,而实际过程中对枢轴记录的赋值是多余的,因为只有一趟排序结束时,即
 *    low=high的位置才是枢轴记录的最后位置。
 * @author Administrator
 *
 */
public class QuikSort {
//  public  void swap(int[] array,int low,int high){
//      int temp = array[low];
//      array[low] = array[ high];
//      array[high] =temp;
//  }   
    public  int getMiddle(int[] array,int low ,int high){
        if(array.length <=0)
            return -1;
        int pivotkey = array[low];//用子表的第一个记录作为基准元素
        while(low<high){            //从表的两端交替的向中间扫描
            while(low<high&&array[high]>=pivotkey)
                high--;
                //swap(array,low,high);
                array[low]=array[high];//改进的方法;将比枢轴记录小的记录移动到低端;
            while(low<high &&array[low]<=pivotkey)
                low++;
                //swap(array,low,high);
                array[high]=array[low];//将枢轴记录大的记录移动到高端;
        }
        array[low] = pivotkey;//枢轴记录到位;
        return low;
    }
    public  void Qsort(int[] array,int low,int high){
        if(low<=high){//长度大于1
            int pivotloc = getMiddle(array,low,high);//将顺序表array一分为2
            Qsort(array,low,pivotloc-1);//对低子表做递归排序
            Qsort(array,pivotloc+1,high);//对高子表做递归排序    
        }
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        QuikSort qs = new QuikSort();
        int[] array = {49,38,65,97,76,13,27,49};
        qs.Qsort(array, 0, array.length-1);
        System.out.println("QUickSort:"+Arrays.toString(array));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值