终结快速排序

作者: Wayne_Dream | 来源:发表于2019-05-04 15:24 被阅读43次

快速排序作为最常用的排序方式(时间复杂度nlogn),Java内置sort排序用的就是快排,也是面试中常考题型,这里来将这个问题彻底解决,之前总是忘记其中的细节,知其然不知其所以然。

1,首先得接收一个数组

        System.out.println("请输入一个数组(用英文逗号“,”间隔):");
        String s = sc.nextLine();
        String[] str = s.split(",");
        ArrayList<Integer> list = new ArrayList<>();
            for(int i=0; i<str.length; i++){
            list.add( Integer.parseInt(str[i]));
        }

这里可以用简单数组int[]接收,也可以用ArrayList<integer>接收。使用ArrayList的好处就是方便,不需要设置数组大小,输出显示数组也不需要遍历。

2,正式开始写快排的递归

public static void quickSort(ArrayList<Integer> list, int start, int end){

        //存取开始/结束的数组下标
        int left = start;
        int right = end;

        //设定递归结束条件
        if(left>right || list==null){
            return;
        }
        //选择标志位为数组左边的数
        int flag = list.get(left);
        //注意:不可将条件限定为<=,不然会发生数组越界IndexOutOfBoundsException
        while(left<right){
            //从数组right开始往左找,直到找到一个比标志数小的数退出循环
            //或者当left=right时,退出循环
            while(left<right && list.get(right)>=flag){
                right--;
            }
            //将这个比标志数小的数覆盖在left上
            list.set(left,list.get(right));
            //从数组left开始往右找,直到找到一个比标志数大的数退出循环
            //或者当left=right时,退出循环
            while (left<right && list.get(left)<=flag){
                left++;
            }
            //将这个比标志数大的数覆盖在right上
            list.set(right,list.get(left));
            //最后将标志位赋给left
            list.set(left,flag);

        }
        //递归左右两个数组
        quickSort(list,start,left-1);
        quickSort(list,left+1,end);
    }

注意事项:
1,需要时时判断left<right,一旦相等就得退出循环
2,设定递归结束条件
3,递归数组的左右边界的选定

3,完整代码

import java.util.ArrayList;
import java.util.Scanner;


/*
* 快速排序
* */
public class QuickSort {
    public static void quickSort(ArrayList<Integer> list, int start, int end){

        //存取开始/结束的数组下标
        int left = start;
        int right = end;

        //设定退出递归条件
        if(left>right || list==null){
            return;
        }
        //选择标志位为数组左边的数
        int flag = list.get(left);
        //注意:不可将条件限定为<=,不然会发生数组越界IndexOutOfBoundsException
        while(left<right){
            //从数组right开始往左找,直到找到一个比标志数小的数退出循环
            //或者当left=right时,退出循环
            while(left<right && list.get(right)>=flag){
                right--;
            }
            //将这个比标志数小的数覆盖在left上
            list.set(left,list.get(right));
            //从数组left开始往右找,直到找到一个比标志数大的数退出循环
            //或者当left=right时,退出循环
            while (left<right && list.get(left)<=flag){
                left++;
            }
            //将这个比标志数大的数覆盖在right上
            list.set(right,list.get(left));
            //最后将标志位赋给left
            list.set(left,flag);

        }
        //递归左右两个数组
        quickSort(list,start,left-1);
        quickSort(list,left+1,end);
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个数组(用英文逗号“,”间隔):");
        String s = sc.nextLine();
        String[] str = s.split(",");
        ArrayList<Integer> list = new ArrayList<>();
            for(int i=0; i<str.length; i++){
            list.add( Integer.parseInt(str[i]));
        }
        int start = 0;
        int end = list.size()-1;
        quickSort(list, start, end);
        System.out.println(list);
    }
}

相关文章

  • 终结快速排序

    快速排序作为最常用的排序方式(时间复杂度nlogn),Java内置sort排序用的就是快排,也是面试中常考题型,这...

  • 七大排序算法之快速排序

    七大排序算法之快速排序 @(算法笔记)[排序算法, 快速排序, C++实现] [TOC] 快速排序的介绍: 快速排...

  • 面试准备--排序

    堆排序 快速排序(simple) 快速排序(regular) 归并排序 Shell排序 插入排序 选择排序 冒泡排序

  • 排序

    插入排序 选择排序 冒泡排序 归并排序 快速排序* 三路快速排序

  • 算法笔记01-排序#2

    快速排序敢叫快速排序,那它一定得快。 快速排序 概述 快速排序也是分治排序的典型,它快,而且是原地排序。不过,要防...

  • PHP 实现快速排序

    导语 这篇了解下快速排序。 快速排序 快速排序(英语:Quicksort),又称划分交换排序(partition-...

  • 快速排序的Python实现

    目录 快速排序的介绍 快速排序的Python实现 快速排序的介绍 快速排序(quick sort)的采用了分治的策...

  • 数据结构与算法 快速排序

    起因:快速排序,又称分区交换排序,简称快排,之前没有了解过,抽空学习一下。 快速排序 1 快速排序 快速排序的定义...

  • 数组-快速排序

    采用快速方式对数组进行排序 快速排序百科:快速排序(Quicksort)是对冒泡排序算法的一种改进.快速排序是通过...

  • 浅谈排序的终结者-快速排序算法

    真正的才智是刚毅的志向。 序言 快速排序算法是大话数据结构的算法模块最后的一块,也是排序算法中最重要的算法,没有之...

网友评论

    本文标题:终结快速排序

    本文链接:https://www.haomeiwen.com/subject/plwxoqtx.html