快速排序(Quick Sort)

   /**
     * 1.2 快速排序: 首先任意选取一个数据(通常选第一个)作为关键数据,
     * 然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,
     * 即确定该数的最终位置,该数两边为两个区间,在它们中各找一个关键
     * 数据继续进行前面的操作,直到所有区间都只有一个数为止,表示所有数
     * 的最终位置都被确定
     * 
     * 一趟快速排序的算法是:
     * 1)设置两个变量i,j,排序开始的时候:i=0,j=N-1;
     * 2)以第一个数组元素作为关键数据,赋值给key,即key=nums[0];
     * 3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值nums[j],将nums[j]和nums[i](key)互换;
     * 4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的nums[i],将nums[i]和nums[j](key)互换;
     * ......
     * 5)当i=j时,该轮排序结束,此时i,j都指向key,key所在的位置i或j即为分割点.
     * 
     * EX: int[] nums={8(key),1,4,2,23,10}; <
     * 
     *                 8(key),1,4,2,23,10
     *                 2,1,4,8(key),23,10
     *                 
     *                 2(key),1,4 | 8 | 23(key),10
     *                 1,2,4      | 8 | 10,23
     *                 
     *                 1(key) | 2 | 4(key) | 8 | 10(key) | 23
     *                 
     * 快速排序是不稳定的排序。
     * 快速排序的时间复杂度为O(nlogn)。
     * 当n较大时使用比较好,当序列基本有序时不好。
     */

    public static void quickSort(int[] nums, int head, int tail) {
        if(head>=tail)
            return ;
        int i=head;
        int j=tail;
        int key=nums[i];
        int temp=0;
        while(i!=j){
            while(i!=j){
                if(key>nums[j]){
                    temp=nums[j];
                    nums[j]=nums[i];
                    nums[i]=temp;
                    break;
                }else {
                    j--;
                }
            }
            while(i!=j){
                if(nums[i]>key){
                    temp=nums[j];
                    nums[j]=nums[i];
                    nums[i]=temp;
                    break;
                }else {
                    i++;
                }
            }
        }
        int mid=i;
        quickSort(nums,head,mid-1);
        quickSort(nums,mid+1,tail);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值