zoukankan      html  css  js  c++  java
  • 快速排序

    问题:

    Input:
    s = 7, nums = [5,3,1,7,5,20,2,4,3,2,2,1,2,4,3]
    Output:
    [1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 7, 20]
    /*
    例子:
    3,8,7,1,2
    2,8,7,1,3
    2,3,7,1,8
    2,1,7,3,8
    2,1,3,7,8
        
    1,2,3,7,8
    */

    状态码朴素写法:

    import java.util.Arrays;
    
    public class test {
        public static void main(String[] args) {
            int[] nums= {5,3,1,7,5,20,2,4,3,2,2,1,2,4,3};
            quicklySort(nums,0,nums.length-1);
            //Arrays.sort(nums);
            System.out.println(Arrays.toString(nums));
        }
        public static int[] quicklySort(int[] nums,int prefix,int suffix) {
            //问题出在相同元素时不好判断//解决:相同的时候将其向前移或后移
            //问题出在换了一次之后,交换的顺序错误//解决:加入状态码
            int tempprefix=prefix;
            int tempsuffix=suffix;
            int status=0;
            if (prefix==suffix) return nums;
            
            while (prefix<suffix) {
                if (nums[prefix]>nums[suffix]) {
                    swap(nums,prefix,suffix);
                    status=status^1;//第一次交换状态为1
                    if (status==1) {
                        prefix++;
                    }else {
                        suffix--;
                    }
                } else {
                    if (status==1) {
                        prefix++;
                    }else {
                        suffix--;
                    }
                }
            }
            if (prefix==suffix) {
                quicklySort(nums, tempprefix,prefix-1);
                quicklySort(nums, suffix+1, tempsuffix);
            }
            return nums;
        }
        public static void swap(int[] nums,int prefix,int suffix) {
            int temp=nums[prefix];
            nums[prefix]=nums[suffix];
            nums[suffix]=temp;
        }
    }

    中值无状态码写法:

    import java.util.Arrays;
    
    public class test {
        public static void main(String[] args) {
            int[] nums= {5,3,1,7,5,20,2,4,3,2,2,1,2,4,3};
            nums=quicklySort(nums,0,nums.length-1);
            System.out.println(Arrays.toString(nums));
            
        }
    
        public static int[] quicklySort(int[] nums,int prefix,int suffix) {
            int centervalue=nums[(prefix+suffix)>>1];
            if (prefix>=suffix) return nums;
            
            int tempprefix=prefix-1;//进入循环,防止数组越界
            int tempsuffix=suffix+1;
            
            while (tempprefix<tempsuffix) {
                do {tempprefix++;} while (centervalue>nums[tempprefix]);
                do {tempsuffix--;} while (centervalue<nums[tempsuffix]);
                if (tempprefix<tempsuffix) {
                    int temp=nums[tempprefix];
                    nums[tempprefix]=nums[tempsuffix];
                    nums[tempsuffix]=temp;
                }
            }
            //System.out.println(Arrays.toString(nums));
            quicklySort(nums, prefix,tempprefix-1);
            quicklySort(nums, tempsuffix+1, suffix);
            return nums;
        }
    }

    随机快排

    import java.util.*;
    
    public class Main{
    
        public static void main(String[] args) {
            int[] nums=new int[]{1,3,4,7,3,6,2,1,3,2,5,7,2,3,1,2,1};//[0, 1, 2, 2, 3, 3, 3, 4, 5, 6, 7, 7]
            quickSort(0,nums.length-1,nums);
            System.out.println(Arrays.toString(nums));
        }
    
        public static void quickSort(int l,int r,int[] nums){
            if(l>=r) return;
            swap(nums,l+(int)StrictMath.random()*(r-l+1),r);//StrictMath.random() 取值 [0.0,1.0)//随机为一个概率事件,使其复杂度为O(nlongn)
            int prefix=l-1;
            int suffix=r;
            for(int curr=l;curr<suffix;curr++){
    
                while(nums[curr]>nums[r] && curr<suffix){//若if在上,经过此过程后会造成小于当前的数出现
                    swap(curr,--suffix,nums);
                }
                if(nums[curr]<nums[r] && curr<suffix){
                    swap(curr,++prefix,nums);
                }
            }
            swap(r,suffix,nums);
            quickSort(l,prefix,nums);
            quickSort(suffix,r,nums);
        }
        public static void swap(int l,int r,int[] nums){
            int temp=nums[l];
            nums[l]=nums[r];
            nums[r]=temp;
        }
    }

    户枢不蠹,流水不腐

  • 相关阅读:
    Spring事务原理一探
    浅谈AI视频技术超分辨率
    网易云信独家技术支持,壹点灵领跑心理服务行业
    音视频技术“塔尖”之争,网易云信如何C位出道?
    浅析为何使用融合CDN是大趋势?
    谈谈接入各种第三方推送平台的技术方案和一点经验
    编解码器之战:AV1、HEVC、VP9和VVC
    三年深入探索,网易云信让在线医疗做到技术“在线”
    5分钟学会Java9-Java11的七大新特性
    网易云信案例简析:锤科情怀缩影,子弹短信路在何方?
  • 原文地址:https://www.cnblogs.com/yunianzeng/p/13209147.html
Copyright © 2011-2022 走看看