扯扯快排(快速排序)

首先扯淡,正题在分割线下面
排序要的就是 速度够快, 耗费内存少,给这个方法起名字的人感觉像是在打广告。
现在排序动不动就是搞个集群,分块排,再合并,毕竟数据量太大了。

首先这个快排的适用情况是数据比较分散,不论是值的范围,还是组成
就是将需要排序的数据划分成等大区间,数据分布比较均匀
-------------------------------------我是分割线--------------------------------------

public class QuickSort {
    
    /*
     * data是存放数据的数组
     * begin是需要排序的第一个数据
     * end是需要排序的最后一个数据
     */
    public static void sort(int[] data, int begin, int end)
    {
        
        int keyIndex = end;
        int keyValue = data[keyIndex];
        
        int left = begin;
        int right = end;
        
        while (begin < end)
        {
            //从左向右,找到第一个比关键值大的数字就停止寻找。
               // 或者发现到右边,都没有找到,就不找了。
            while(data[begin] < keyValue && begin < end)
            {
                begin++;
            }
            
            //如果发现没到头(就是没找完,就发现了比关键值大的数字)
            //就把找到的那个值,往后移,移到end下标所在的位置
               // 开始那个end位置的值已经腾出去了,放到keyValue里了
            if(begin < end)
            {
                data[end] = data[begin];
            }
            
            //从右向左,找到第一个比关键值小的数字就停止寻找。
               //或者发现到左边,都没有找到,就不找了。
            while(data[end] > keyValue && end > begin)
            {
                end--;
            }
            
            //如果发现没到头(就是没找完,就发现了比关键值小的数字)
            //就把找到的那个值,往左移,移到begin下标所在的位置
            //上面那个begin位置的值已经腾出去了,放到end里了
              // 如果上面没有能移动值,这也移动不了
            if(begin < end)
            {
                data[begin] = data[end];
            }
        }
        
        //这时候就把keyValue放回去
        data[end] = keyValue;
        
        //接下来,就用end下标作为分界线,左右两边各自进行一次快排
        if (left < end-1)
        {
            sort(data, left, end-1);
        }
        
        if( end+1 < right)
        {
            sort(data, end+1, right);
        }
    }
    
    public static void main(String[] args) 
    {
        int[] data = {96, 6, 8, 5, 9, 7, 10, 23, 13, 17};
        
        QuickSort.sort(data, 0, 9);
        
        for (int i = 0; i < data.length; i++) {
            System.out.print(data[i]+" < ");
        }
    }
}
本人博客:xingzhi.info

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值