快排

之前学习数据结构的时候了解了一下快排,但后面没怎么用就慢慢忘记了,于是现在就写个博客回顾一下。

快排实际上是对冒泡排序的一中改进,基本思想在于划分。基本有以下几个步骤

  1.初始关键字序列,设定两个指针,指针i指向第一个元素,指针j指向最后一个关键字

  2.从指针j开始,向前检查每个关键字,直到发现小于划分元素为止

  3.把元素移动到指针i所指的位置

  4.移动完元素后,把指针i往后移动一个位置。

  5.从指针i开始,向后检查每个关键字,直到发现大于划分的元素为止

  6.把元素移动到指针j所指的位置,并把指针j往前移动一个元素

  7.继续重复第二步,当i和j指向同一个元素,则划分结束

  8.继续对目标元素左边和右边进行排序。

代码如下

import java.util.Arrays;

public class Main {

    public static void main(String[] args) {
        int[] qs = {8,9,2,3,5,4,8,6,2,1};
        System.out.println(Arrays.toString(qs));
        System.out.println();
        //快排
        quickSort(qs,0,qs.length-1);

        System.out.println(Arrays.toString(qs));


    }

    /**
     *
     * @param qs 待排序的数据
     * @param i 待排序首元素下标
     * @param j 待排序尾元素下标
     */
    private static void quickSort(int[] qs, int i, int j) {
        if(qs.length==0) return ;  //判断
        int k ;
        if(i<j) {     //递归出口
            k = partition(qs, i, j);  //调用划分函数,把序列分成两部分
            quickSort(qs, i, k - 1); //对前部分进行快速排序
            quickSort(qs, k + 1, j); //对后部分进行快速排序
        }


    }

    /**
     *
     * @param a 待排序得数组
     * @param i 待排序首元素下标
     * @param j 待排序尾元素下标
     * @return
     */
    private static int partition(int[] a, int i, int j) {
            int temp = a[i];     //选择首元素为划分元素
            while(i<j){          //根据步骤2,当i>=j时候结束本次划分
                while (a[j]>=temp&&i<j) j--;  //从后往前找到第一个小于划分元素的元素
                if(i<j) a[i++] = a[j];       //找到则移动元素,并把下标i增加1

                while ((a[i]<=temp&&i<j)) i++; //从前往后找到第一个大于划分元素的元素
                if(i<j) a[j--] =a[i];       //找到则移动元素,并把下标j减1
            }

            a[i] = temp;        //划分结束,最后设置把划分元素置于目标位置
            return  i;          //返回划分元素所在下标
    }






}

最后总结一下

快排时间复杂度O(nlog2^n)  最坏情况为O(n^2) 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值