交换排序——快速排序

news/2024/5/19 21:14:12 标签: 快速排序, 排序, 交换排序, java

一.基本算法

1)选择一个基准元素,通常选择第一个元素或者最后一个元素;
2)通过一趟排序讲待排序的记录分割成独立的两部分,其中基准元素左边的元素均比基准元素小,右边的元素均比基准元素大;
3)然后分别对这两部分记录用同样的方法继续进行排序,直到整个序列有序。

排序>快速排序示例">二.排序>快速排序示例

1.一趟排序的过程
这里写图片描述
2.排序的全过程
这里写图片描述

排序>快速排序java实现">三.排序>快速排序的Java实现

java">    javadoc">/**
     * 排序>快速排序
     *javadoctag"> @param array
     */
    public static void quickSort(int[] array){
        quickSort(array,0,array.length-1);
    }

    javadoc">/**
     * 递归形式的分治排序算法
     *javadoctag"> @param array
     *javadoctag"> @param low
     *javadoctag"> @param high
     */
    public static void quickSort(int[] array, int low, int high){
        if(low < high){//递归出口
            int middle = getMiddle(array,low,high);
            quickSort(array,low,middle);
            quickSort(array,middle+1,high);
        }
    }

    javadoc">/**
     * 一趟比较,使得中轴左边的元素都比中轴小,右边的元素都比中轴大
     *javadoctag"> @param array
     *javadoctag"> @param low
     *javadoctag"> @param high
     *javadoctag"> @return  中轴的位置
     */
    public static int getMiddle(int[] array, int low, int high){
        int privot = array[low];    //数组的第一个元素作为中轴
        while(low < high){
            while(low < high && array[high]>privot){
                --high;
            }
            array[low] = array[high];   //比中轴小的记录往前移
            while(low < high && array[low]<privot){
                ++low;
            }
            array[high] = array[low];   //比中轴大的记录往后移
        }
        array[low] = privot;
        return low; //中轴的位置
    }

排序>快速排序效率分析">四.排序>快速排序效率分析

排序>快速排序是通常被认为在同数量级(O(nlgn))的排序方法中平均性能最好的。但若初始序列按关键码有序或基本有序时,快排序反而蜕化为冒泡排序排序>快速排序是一个不稳定的排序方法。

五.应用场景

数据越随机分布时,排序>快速排序算法的性能越好。


http://www.niftyadmin.cn/n/1530705.html

相关文章

快速理解脏读、不可重复读、幻读和MVCC

转载自https://cloud.tencent.com/developer/article/1450773

Java多线程机制详解

一.创建线程的两种方式 1.继承Thread class MyThread extends Thread{private static int ticket 10;private String name;public MyThread(String name){this.name name;}public void run(){while(this.ticket>0){System.out.println(this.name"卖票---->"…

Redis数据结构(一)字符串SDS、双端链表、字典

SDS 特性 1、常数时间获取长度 2、杜绝缓冲区溢出&#xff0c;当连接字符串后长度超过buf实际长度&#xff0c;会预先扩展空间。 3、空间预分配。当对SDS修改并且需要扩展空间时&#xff0c;SDS为预分配双倍字符串长度的空间&#xff08;len < 1MB&#xff09;。例如&#x…

Scanner用法详解

一.创建Scanner对象 Scanner类可以接收任意的输入流。 在Scanner类中提供了一个可以接收InputStream类型的构造方法&#xff0c;这就表示只要是字节输入流的子类都可以通过Scanner类进行方便的读取。 例如&#xff1a; 读取键盘输入&#xff1a;Scanner scan new Scanner(…

Redis数据结构(二)跳表、整数集合、压缩列表

Skip List 跳表是一种有序数据结构&#xff0c;Redis使用跳表作为有序集合键的底层实现之一。 redis6.0的代码中&#xff0c;跳表结构由server.h中定义&#xff0c;其中zskiplistNode表示跳表节点&#xff0c;zskiplist保存跳表节点相关信息&#xff0c;比如节点数量&#xff…

Redis数据结构(三)——字符串对象、列表对象、hash对象、集合对象、有序集合对象

在前面的内容里&#xff0c;介绍了Redis用到的主要数据结构字符串、双端链表、字典、压缩链表、整数集合等。Redis基于这些数据结构构建了一个对象系统&#xff0c;这个系统包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象。本文将介绍对象系统的机制。 1. 对象类…

Java的native关键字

一. 什么是Native Method 简单地讲&#xff0c;一个Native Method就是一个java调用非java代码的接口。一个Native Method是这样一个java的方法&#xff1a;该方法的实现由非java语言实现&#xff0c;比如C。这个特征并非java所特有&#xff0c;很多其它的编程语言都有这一机制…

Java的静态方法、静态属性、静态代码块

一、静态方法 在Java里&#xff0c;可以定义一个不需要创建对象的方法&#xff0c;这种方法就是静态方法。要实现这样的效果&#xff0c;只需要在类中定义的方法前加上static关键字。例如&#xff1a; 一般情况下&#xff0c;工具类里面的方法都会定义为静态方法&#xff0c;…