快速排序

作者: Simplelove_f033 | 来源:发表于2019-03-04 10:51 被阅读0次

应用场景
快速排序 主要是数据量大并且是线性结构
短处
有大量重复数据的时候,性能不好
单向链式结构处理性能不好(一般来说,链式都不使用)
思路int[] arr={31,68,45,90,23,39,54,12,87.76}
其实思想是蛮简单的,就是通过第一遍的遍历(让low和high指针重合)来找到数组的切割点。
假设有
1、第一步:首先我们从数组的left位置取出该数(31)作为基准(base)参照物。


image.png

2、第二步:从数组的high位置向前找,一直找到比(base)小的数,
如果找到,将此数赋给low位置(也就是将12赋给31),
此时数组为:12,68,45,90,23,39,54,12,87.76
low和high指针分别为前后的12。


image.png
3、第三步 此时low角标要向前移动一位 移动到68位置上,high不变
image.png
4、第四步 从数组的low位置向后找,一直找到比(base)大的数,
如果找到,将此数赋给right的位置(也就是40赋给10),
此时数组为:12、68、45、90、23、39、54、68、87、76
low和hiigh指针分别为前后的68。
image.png

5、第五步 :重复“第二,第三 第四“步骤,直到low和high指针重合,
最后low和high角标在45位置上重合
此时的数组为:12、23、45、90、45、39、54、68、87、76


image.png

6、基准(base)参照物值赋值给low和high重合的位置上


image.png

7、第七步、此时31已经潜入到数组的内部,20的左侧一组数都比31小,31的右侧作为一组数都比31大,
以31为切入点对左右两边数按照"第一,第二,第三,第四,第五,第六"步骤进行。就可以把整个数据给排序完成。

代码如下

    //快速排序     31  21  59  68  12  40
        //    x=31
        public static void quickSort(int[] array,int begin,int end){
            if(end-begin<=0) return;
            int x=array[begin];
            int low=begin;//0
            int high=end;//5
            //由于会从两头取数据,需要一个方向
            boolean direction=true;
            L1:
            while(low<high){
                if(direction){//从右往左找
                    for(int i=high;i>low;i--){
                        if(array[i]<=x){
                            array[low++]=array[i];
                            high=i;
                            direction=!direction;
                            continue L1;
                        }
                    }
                    high=low;//如果上面的if从未进入,让两个指针重合
                }else{
                    for(int i=low;i<high;i++){
                        if(array[i]>=x){
                            array[high--]=array[i];
                            low=i;
                            direction=!direction;
                            continue L1;
                        }
                    }
                    low=high;
                }
            }
            //把最后找到的值 放入中间位置
            array[low]=x;
            //开始完成左右两边的操作
            quickSort(array,begin,low-1);
            quickSort(array,low+1,end);
        }

相关文章

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

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

  • 面试准备--排序

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

  • 排序

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

  • 算法笔记01-排序#2

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

  • PHP 实现快速排序

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

  • 快速排序的Python实现

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

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

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

  • 数组-快速排序

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

  • OC数据结构&算法

    更多整理资料尽在?一平米小站 目录 选择排序 冒泡排序 插入排序 快速排序 双路快速排序 三路快速排序 堆排序 选...

  • 要成功就做一百题-94

    题目名称 今天来几个排序,都是经典题目,包括带拆分的快速排序,堆排序,归并排序。 描述 快速排序快速排序核心就是分...

网友评论

    本文标题:快速排序

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