排序算法之快速排序

快速排序:这个算法搞了快一下午,终于搞懂了。

现在习惯每次写代码前把所有思路等全部先写遍,写到注释里。所以直接贴代码了

复杂度:

在最优的情况下,快速排序算法的时间复杂度为O(nlogn)。在最坏的情况下,最终其时间复杂度为O(n2)。平均情况,空间复杂度也为O(logn)。
package quick;

import org.omg.Messaging.SYNC_WITH_TRANSPORT;

import java.util.Queue;
package quick;

import org.omg.Messaging.SYNC_WITH_TRANSPORT;

import java.util.Queue;

/*快速排序:
* 思想:不断地选取线性表中的一个点,对它进行排序,把小于它的数放在左边,大于它的数放在右边
* 当对每个点都进行了选取排序,那么我们的线性表就完成顺序排序
* 算法设计思路:设计两个哨兵一个是low,high分别存储最左侧的点和最右侧的点,再设计一个基准数pivot用于把数按大小放在这个数的两边
* 因为当一个点排序后,会把他分成两部分,我们接下来再对左侧以同样的方式排序。知道左侧全部有序,再去分右侧,那么我们可以用递归来实现
* 递归的基本结构:
*    第一部分:找点,并对这个点进行排序
*    第二部分:先对找好的点的左侧进行排序,也就是递归调用这个函数。
*    第三部分:左侧完了再调用右侧开始排序,也是递归调用这个函数
*    那么什么时候不调用呢?就是当low>=high时。这时相当于第一个循环已经结束了
* */
public class Quick {
       public static void main(String[] args){
           int[] quick = new int[]{0, 4, 2, 3, 2, 52, 2, 1, 6, 42, 54};//初始化操作数组
           System.out.print("排序前:");
           for (int f : quick) {
               System.out.print(f+",");
           }
           System.out.println(" ");
           QSort(quick,1,quick.length-1);
           System.out.print("排序后:");
           for (int f : quick) {
               System.out.print(f+",");
           }
       }
       public static void QSort(int[] quick,int low,int high) {//这是递归函数,需要获得参数,分别是顺序表,low,high
           int pivot;//设置一个准基数
           if (low < high) {//当low=high时相当于最底层的递归已经结束了
               pivot = partitation(quick, low, high);//选取准基数,并对它进行排序(从1开始),返回准基数便于后面使用
               QSort(quick, low, pivot - 1);//进行递归遍历左侧,开始的点一直是low,也就是最左侧,结束的点是上一层准基数的前一个
               QSort(quick, pivot + 1, high);//递归遍历右侧,开始的点是准基数的后一个,结束的点是最后一个
           }
       }

       public static int partitation(int[] quick,int low,int high){//选取准基数,并且进行点的左右大小排序
          int  pivotkey=quick[low];//选择准基数为quick[low]
          while (low<high) {//从表的两端向中间扫描,当low<high时才进行扫面
              //因为都是选取左边第一个数为准基数,我们就从右边开始往左边扫描,也就是high开始
              //第一个判断条件low<high时是为了判断减后是否已经查完所有了
              //当发现quick[high]<quick[low],交换过来,让小的数跑到这个数的左边,这个时候准基数跑到了high的位置
              while(low<high&&quick[high]>=pivotkey){ //这句执行完后要么low==high,要么到了符合交换条件的地方
                     high--;
              }//high向左平移一位
              swap(quick,low,high);//把比准基点小的交换到左边来,这个时候准基数跑到了high的位置
              //当发现quick[high]>quick[low],交换,这时准基数跑到了low的位置
              while (low<high&&quick[low]<=pivotkey){
                     low++;
              }//low向右平移一位
              swap(quick,low,high);//把比准基点大的交换到右边来,这个时候准基数跑到了low的位置
          }
          return low;
       }
    public static void swap(int[] L,int i,int j){//交换函数
        int k;
        k=L[i];
        L[i]=L[j];
        L[j]=k;
    }
}

这里推荐一下我看的一个短视频,就几分钟,但是看完立马能了解算法的原理,就是有些魔性,现在看到这个算法脑海里就是一群人欢脱的跳舞:https://www.bilibili.com/video/av17004952?from=search&seid=10113002062423283368

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值