博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【排序算法】- 快速排序
阅读量:4147 次
发布时间:2019-05-25

本文共 2622 字,大约阅读时间需要 8 分钟。

文章目录

1 快速排序法介绍:

快速排序(Quicksort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行

,以此达到整个数据变成有序序列

2 快速排序法示意图:

在这里插入图片描述

3 快速排序法应用实例:

要求:对[-9,78,0,23,-567,70]进行从小到大的排序,要求使用快速排序法。【测试8w和800w】说明[验证分析]:

1)如果取消左右递归,结果是-9-5670237870
2)如果取消右递归,结果是-567-90237870
3)如果取消左递归,结果是-9-5670237078
4)代码实现

package com.sukang.sort;import java.text.SimpleDateFormat;import java.util.Arrays;import java.util.Date;/** * @description: *      快速排序 * @author: sukang * @date: 2020-11-11 9:02 */public class QuickSort {    public static void main(String[] args) {        //测试快排的执行速度        //创建要给80000个的随机的数组        int[] arr = new int[80000];        for (int i = 0; i < 80000; i++) {            arr[i] = (int)(Math.random()*8000000);//生成一个[0,8000000)数        }        //没排序之前数组遍历        System.out.println("排序前的数组" + Arrays.toString(arr));        Date date1 = new Date();        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");        String date1Str = simpleDateFormat.format(date1);        System.out.println("排序前的时间是=" + date1Str);        quickSort(arr,0,arr.length-1);        Date date2 = new Date();        String date2Str = simpleDateFormat.format(date2);        System.out.println("排序后的时间是="+date2Str);        //排序之后数组遍历        System.out.println("排序后的数组" + Arrays.toString(arr));    }    public static void quickSort(int[] arr, int left, int right) {        int l = left; //左下标        int r = right; //右下标        //pivot 中轴值        int pivot = arr[(left + right)/2];        int temp = 0;//临时变量,作为交换时使用        //while循环的目的是让比pivot值小放到左边        //比pivot值大放到右边        while(l < r){            //在pivot的左边一直找,找到大于等于pivot值,才退出            while(arr[l] < pivot){                l += 1;            }            //在pivot的右边一直找,找到小于等于pivot值,才退出            while(arr[r] > pivot){                r -= 1;            }            //如果l >= r说明pivot的左右两的值,已经按照左边全部是            //小于等于pivot值,右边全部是大于等于pivot值            if(l >= r){                break;            }            //交换            temp = arr[l];            arr[l] = arr[r];            arr[r] = temp;            //如果交换后,发现这个arr[l] = pivot值 相等 r--,前移            if(arr[l] == pivot){                r -= 1;            }            //如果交换完后,发现这个arr[r] == pivot值 相等 l++,后移            if(arr[r] == pivot){                l += 1;            }        }        //如果l == r,必须l++, r--, 否则为出现栈溢出        if(l == r){            l += 1;            r -= 1;        }        //向左递归        if(left < r){            quickSort(arr, left, r);        }        //向右递归        if(right > l){            quickSort(arr, l, right);        }    }}

运行结果

在这里插入图片描述

转载地址:http://ulnti.baihongyu.com/

你可能感兴趣的文章
Spring MVC和Struts2的比较
查看>>
Hibernate和IBatis对比
查看>>
Spring MVC 教程,快速入门,深入分析
查看>>
Android 的source (需安装 git repo)
查看>>
Commit our mod to our own repo server
查看>>
LOCAL_PRELINK_MODULE和prelink-linux-arm.map
查看>>
Simple Guide to use the gdb tool in Android environment
查看>>
Netconsole to capture the log
查看>>
Build GingerBread on 32 bit machine.
查看>>
How to make SD Card world wide writable
查看>>
Detecting Memory Leaks in Kernel
查看>>
Linux initial RAM disk (initrd) overview
查看>>
Timestamping Linux kernel printk output in dmesg for fun and profit
查看>>
There's Much More than Intel/AMD Inside
查看>>
CentOS7 安装MySQL 5.6.43
查看>>
使用Java 导入/导出 Excel ----Jakarta POI
查看>>
本地tomcat 服务器内存不足
查看>>
IntelliJ IDAE 2018.2 汉化
查看>>
基于S5PV210的uboot移植中遇到的若干问题记录(一)DM9000网卡移植
查看>>
Openwrt源码下载与编译
查看>>