快排--java实现

快排思想:
1 、确定基准值,(一般是取第一个)或者是取数组的中间值
2 、从后面开始查找第一个小于基准值的数,j- -操作,用j来标记数组下标;再从第二个开始,找到第一个大于基准值的数,i++操作,用i来标记,.当满足(i!=j)时,交换j和i下标对应的值,…,直到i==j时,1.基准值归位,2.将旧基准值置最终的位置。(这俩步就是交换基准值和该基准值最终位置的值,注意先后顺序),至此一次快排结束,然后递归执行基准值左边的快排,基准值右边的快排…..

1.经典款

private static void quickSort(int []a,int left,int right)
    {
        if(left>right)
        {
            return;
        }
        int i,j,pivot;
        i=left;j=right;
        pivot= a[left];
        while(i!=j)
        {
            while(i<j && a[j]>=pivot)
            {
                j--;
            }
            if(i<j)
            {
            a[left] = a[j];
            }
            while(i<j && a[i]<=pivot)
            {
                i++;
            }
            if(i<j)
            {
            a[j]=a[i];
            }
        }
        a[i]=pivot;
        quickSort(a,left,i-1);
        quickSort(a,i+1,right);
    }

2.变化款

public class TestQuickSort {

    public static void main(String[] args) {
        int [] arr = {49,38,65,97,76,13,27,60,61};
        quickSort(arr,0,arr.length-1);
        System.out.println("排序后--");
        print(arr);

    }

    private static void print(int[] arr) {
        for(int i=0;i<=arr.length-1;i++)
        {
            System.out.print(arr[i]+"\t");
        }
        System.out.println();
    }
    /**
     * 快排算法
     * @param arr
     * @param i
     * @param j
     */
    private static void quickSort(int[] arr, int start, int end) 
    {
        if(start>=end)
            return;
            int pivot = arr[start];//基准值
            int i = start;
            int j = end;
            while(i!=j)
            {
                while(i<j && arr[j]>=pivot)   
                {//从右开始找到都一个小的
                    j--;
                }
                while(i<j && arr[i]<=pivot)  
                {//找到第一个最大的 
                    i++;
                }
            if(i<j)
            {
                swap(arr,i,j);
            }
          }
            //先将新的基准值归位
            arr[start]=arr[i];//重新确定基准值
            //确定此次快排(基准元素)的元素位置
            arr[i]=pivot;//确定一个元素的最后位置...

            print(arr);
            quickSort(arr,start,i-1);
            quickSort(arr,i+1,end); 
   }
   public static void swap(int[] arr, int i, int j) 
    {
    arr[i] = arr[i] + arr[j];
    arr[j] = arr[i] - arr[j];
    arr[i] = arr[i] - arr[j];
    }
}

经典款和变化款第一次快排的结果是不一样的,但是基准元素的最终位置是一致的,只是交换顺序不同罢了,经典款是一开始就交换了基准值,变化款是最后才交换基准值,不过思想是一样的…我们只要掌握思想就可以了…分治…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值