算法实战java实现快速排序

快排原理介绍

这里写图片描述
在数组s中随便选出一数,做为枢纽值x。
这里写图片描述
s1和s2
大小不必相等。递归的向s1和s2使用上面的方法,结合起来就拍好序了。

注意:

在实际应用中数组的数量小于20,插入排序的速度快与快速排序。

java实现

public class QuickSort {

    private final int CUTOFF = 20;

    void quicksort( int[] list) {
        quicksort( list, 0, list.length - 1);
    }

    void quicksort( int[] list, int left, int right) {
        if (left + CUTOFF <= right)
        {
            //得到枢纽元
            int pivot = median3(list, left, right);

            int i = left;
            int j = right-1;

            for( ; ; )
            {
                //当俩个指针都停下时,进行交换
                while ( list[++i] < pivot) {}
                while ( list[--j] > pivot) {}
                //检查是否越界
                if (i < j)
                    swap(list, i, j);
                else
                    break;

            }
            //将枢纽元放回i所在位置
            swap(list, i, right - 1);
            //递归调用
            quicksort( list, left, i - 1);
            quicksort( list, i+ 1, right);    
        }
        else 
            inserSort( list, left, right);
    }
    //将首尾中3个数进行排序并返回中值
    int median3( int[] list, int left, int right) {
        int center = (left + right ) / 2;
        //若center值小于left值,二者交换
        if (list[center] < list[left])
            swap( list, left, center);
        //若right值小于left值,二者交换
        if (list[right] < list[left])
            swap( list, left, right);
        //若right值小于center值,二者交换
        if (list[right] < list[center])
            swap( list, center, right);
        //最终结果为left, center,right值从小到大排列

        //将中值于倒数第二个值交换
        swap( list, center, right-1);
        //返回中值
        return list[ right - 1 ];       
    }
    //交换数组中的位置
    void swap( int[] list, int left, int right) {
        int temp = list[left];
        list[left] = list[right];
        list[right] = temp;  
    }
    //直接插入排序,由小到大   
    void inserSort( int[] list, int left, int right) {
        int j;

        for( int p = left; p <= right; p++ ) {

            int temp = list[p];
            //比较当前位置与前面一个的大小, 如果当前位置较小与前一个交换。
            for ( j = p;  j > 0 && temp - list[ j - 1] < 0; j--)
                list[j] = list[j-1];
            list[j] = temp;
        }

    }   
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值