java快速排序

/**
 *  这段程序并不难,应该很好看懂,我把过程大致讲一下,首先你的脑子里先浮现一个数组和三个指针,
 *  第一个指针称为p指针,在整个过程结束之前它牢牢的指向第一个数,第二个指针和第三个指针分别为lo指针和hi指针,
 *  分别指向最左边的值和最右边的值。lo指针和hi指针从两边同时向中间逼近,在逼近的过程中不停的与p指针的值比较,
 *  如果lo指针的值比p指针的值小,lo++,还小还++,再小再++,直到碰到一个大于p指针的值,这时视线转移到hi指针,
 *  如果 hi指针的值比p指针的值大,hi--,还大还--,再大再--,直到碰到一个小于p指针的值。
 *  这时就把lo指针的值和hi指针的值做一个调换。持续这过程直到两个指针碰面,这时把p指针的值和碰面的值做一个调换,
 *  然后返回p指针新的位置。
 *
 * @author 75-qj
 * @version $Id: QuickSort.java, v 0.1 2010-3-4 上午11:09:35 75-qj Exp $
 */
public class QuickSort {

 

    /**
     * 主算法,运用递归
     *
     * @param n        待排序的数组
     * @param left     数组左边序号
     * @param right    数组右边序号
     */

    void quicksort(int n[], int left, int right) {
        int dp;
        if (left < right) {

            dp = partition(n, left, right);

            quicksort(n, left, dp - 1);

            quicksort(n, dp + 1, right); //这两个就是递归调用,分别整理53左边的数组和右边的数组
        }
    }

 

    /**
     * 返回中间值的位置,下面这函数就是做这个的。
     *
     * @param n        待排序的数组
     * @param left     数组左边序号
     * @param right    数组右边序号
     * @return        
     */

    int partition(int n[], int left, int right) {
        int lo, hi, pivot, t;

        pivot = n[left];
        lo = left - 1;
        hi = right + 1;

        while (lo + 1 != hi) {
            if (n[lo + 1] <= pivot)
                lo++;
            else if (n[hi - 1] > pivot)
                hi--;
            else {
                t = n[lo + 1];
                n[++lo] = n[hi - 1];
                n[--hi] = t;
            }
        }

        n[left] = n[lo];
        n[lo] = pivot;
        return lo;
    }

    public static void main(String[] args) {
        QuickSort q = new QuickSort();

        int[] n = { 53, 12, 98, 63, 18, 72, 80, 46, 32, 21 };

        q.quicksort(n, 0, 9);

        for (int i : n) {
            System.out.println(i);
        }
    }
}

 

 

这个是从网上找的,并非原创。只是自我总结归纳一下,望作者海涵,哈哈。

基础的算法,数据结构,我们这些java人员也不能丢弃,需要好好总结下,才能写出更好的程序。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值