快速排序

快速排序思想
1.在待排序的元素任取一个元素作为基准(通常选第一个元素),称为基准元素;
2.将待排序的元素进行分区,比基准元素大的元素放在它的右边,比其小的放在它的左边;
3.对左右两个分区重复以上步骤直到所有元素都是有序的。

快速排序的稳定性:不稳定
时间复杂度:
数组无序 最好情况 O(nlog2n)
数组有序 最坏情况 O(n^2)

快速排序图解:
这里写图片描述
上述过程是第一趟的快速排序,接下来,我们只需要对基准左面右边元素重复以上的过程,就排序成功。

递归算法


public static int partion(int []a,int low,int high)
    { 
    int tmp=a[low];

    while(high>low){
        while(low<high&&a[high]>=tmp){//从右往左找到比tmp小的数
            high--;//high向左移动

        }
        if(low>=high){//如果high--,直到low和high相遇的话,跳出循环
            break;
        }
        else{//如果low<high并且a[high]<tmp
            a[low]=a[high];
        }
        while(low<high&&a[high]<=tmp){//从左向右找比tmp大的数

            ++low;

        }
        if(low>=high){//如果low++,直到low和high相遇的话,跳出循环
            break;
        }else{//low<high&&a[high]>tmp
            a[high]=a[low];
        }

        }
        a[low]=tmp;//确定新的基准
        return low;//返回基准的下标
    }

    public static void quick1(int []a,int start,int end){
        int par=partion(a, start, end);//先确定第一个基准
        if(par>start+1){//如果基准左面有俩个或者俩个以上的元素
            quick1(a, start, par-1);//左面进行快速排序
        }
        if(par<end-1){//如果基准右面有俩个或者俩个以上的元素
            quick1(a, par+1, end);//右边进行快速排序
        }
    }

非递归算法(用栈来实现,所以我们得先定义一个栈的类)

public static int partion(int []a,int low,int high)
    { 
    int tmp=a[low];

    while(high>low){
        while(low<high&&a[high]>=tmp){//从右往左找到比tmp小的数
            high--;//high向左移动

        }
        if(low>=high){//如果high--,直到low和high相遇的话,跳出循环
            break;
        }
        else{//如果low<high并且a[high]<tmp
            a[low]=a[high];
        }
        while(low<high&&a[high]<=tmp){//从左向右找比tmp大的数

            ++low;

        }
        if(low>=high){//如果low++,直到low和high相遇的话,跳出循环
            break;
        }else{//low<high&&a[high]>tmp
            a[high]=a[low];
        }

        }
        a[low]=tmp;//确定新的基准
        return low;//返回基准的下标
    }
    public static void quick(int []array){
        stack t1 = new stack();
       int low=0;//从数组0号位置开始
       int high=array.length-1;//从数组最后一位开始
       int par=partion(array, low, array.length-1);//先确定第一个基准
       if(par>low+1)//如果基准左面有俩个或者俩个以上的元素
        {
            t1.push(low);//入栈当前low;
            t1.push(par-1);//入栈基准左面的最后一个元素下标
        }
        if(par<high-1)//如果基准右面有俩个或者俩个以上的元素
        {
            t1.push(par+1);//入栈基准右面的第一个元素下标
            t1.push(high);//入栈当前high
        }

       while(!t1.isempty())//栈为空时,说明已经排序完
       {
           high=t1.pop();//确定新的low与high
           low=t1.pop();
           par= partion(array, low, high);//确定新的基准
           if(par>low+1)
            {
                t1.push(low);
                t1.push(par-1);
            }
            if(par<high-1)
            {
                t1.push(par+1);
                t1.push(high);
            }


       }

    }

调试代码

public static void main(String[] args) {
        int []a={12,3,5,6,897,15};
        quick1(a, 0, a.length-1);
        System.out.println(Arrays.toString(a));


    }
//运行结果为
[3, 5, 6, 12, 15, 897]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值