快速排序(Java实现)——捡起代码Day1学习笔记

快速排序(学习里面的双指针的思想)

public class quicksort {
    public static void swap(int[] a,int i,int j)
    {
        int temp=a[i];
        a[i]=a[j];
        a[j]=temp;
    }
    public static void quicksort(int[] a,int begin,int end)
    {
        if(begin<end)
        {
            int i=begin;
            int j=end;
            int temp= a[begin];
            while(i<j)
            {
                while(temp>=a[j]&&i<j)
                {
                    j--;
                }
                while(temp<=a[i]&&i<j)
                {
                    i++;
                }
                swap(a,i,j);
            }
            swap(a,i,begin);
            quicksort(a,begin,i-1);
            quicksort(a,i+1,end);
        }
    }
    public static void main(String arg[])
    {
        int[] num= {23,45,17,11,13,89,72,26,3,17,11,13};
        int n = 12;
        quicksort(num,0,n-1);
        for(int i=0;i<n;i++)
            System.out.print(num[i]+",");
    }
}

利用快速排序双指针思想求解交换次数  

public static void solution(String s)
    {
        int i=0;
        int j=s.length()-1;
        int ans=0;
        char[] a=s.toCharArray();
        for(;i<j;++i,--j)
        {
            for(;(i<j)&&(a[i]=='0');++i){}
            for(;(i<j)&&(a[j]=='1');--j){}
            if(i<j)ans++;
            else break;
        }
        System.out.print(ans);
    }

 

双指针思想求交换里面的符号(只会通过交换完成任务,但是快排是不稳定排序会改变数字的相对位置呀!!);   

public static void solution2(String s)
    {
        int i=0;
        int j=s.length()-1;
        int ans=0;
        char[] a=s.toCharArray();
        for(;i<j;--j)
        {
            if(a[j]=='*')
            {
                char temp=a[i];
                a[i++]=a[j];
                a[j]=temp;
                j++;
            }
        }
        for(int m=0;m<a.length;m++)
            {System.out.print(a[m]);}
    }

 

 

可以不改变顺序的一种方法(也是双指针只不过是倒叙双指针,前面是一正一反)

    public static void solution3(String s)
    {
        int i=s.length()-1;
        int j=s.length()-1;
        int ans=0;
        char[] a=s.toCharArray();
        for(;i>=0;--i)
        {
            if(a[i]!='*')
            {
                char temp=a[i];
                a[i]=a[j];
                a[j--]=temp;
            }
        }
        if(j>=0)
        {
            a[j]='*';
            j--;
        }
        for(int m=0;m<a.length;m++)
        {System.out.print(a[m]);}
    }

 

 

也是两个指针在滑动的例子,第一个窗口要单独考虑进去。

    public static void solution3(String s1,String s2){
        int lena=s1.length();int lenb=s2.length();
        char[] x1=s1.toCharArray();
        char[] x2=s2.toCharArray();
        if(lena<lenb)
            System.out.print("no");;
        int nonlen=0;
        int[] num=new int[700000];
        for(int i=0;i<lenb;i++)
        {
            if(++num[x2[i]-'a']==1)nonlen++;
        }
        for(int i=0;i<lenb;i++)
        {
            num[x1[i]-'a']--;
            if(num[x1[i]-'a']==-1)nonlen++;
            if(num[x1[i]-'a']==0)nonlen--;
            if(nonlen==0)
                System.out.print("yes");
        }
        for(int i=lenb;i<lena;++i)
        {
            int c=x1[i-lenb]-'a';
            ++num[c];
            if(num[c]==1)nonlen++;
            if(num[c]==0)nonlen--;
            c=x1[i]-'a';
            --num[c];
            if(num[c]==-1)nonlen++;
            if(num[c]==0)nonlen--;
            if(nonlen==0)
                System.out.print("yes");
        }
    }

 

如果不用split的话就扫一圈找到空格所在,之后在循环输出就行

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值