java数据结构和算法——快速排序算法示例

目录

    • 一、快速排序算法介绍
    • 二、快速排序算法示意图
    • 三、快速排序算法的应用实例需求
    • 四、快速排序算法示例
    • 五、测试快速排序算法所消耗的时间示例

一、快速排序算法介绍

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

二、快速排序算法示意图

java数据结构和算法——快速排序算法示例_第1张图片

三、快速排序算法的应用实例需求

对 [-9,78,0,23,-567,70] 进行从小到大的 排序,要求使用快速排序法。并测试测试1000万条数据排序耗时。

四、快速排序算法示例

1、代码

package com.rf.springboot01.dataStructure.sort;

import java.util.Arrays;

/**
 * @description: 快速排序示例
 * @author: xiaozhi
 * @create: 2020-08-10 21:20
 */
public class QuickSort {
    public static void main(String[] args) {
        int[] arr = {-9,78,0,23,-567,70};
        quickSort(arr,0,arr.length-1);
        System.out.println(Arrays.toString(arr));
    }
    /** 
    * @Description:  快速排序方法
    * @Param: [arr] 
    * @Author: xz  
    * @return: void
    * @Date: 2020/8/10 21:21  
    */ 
    public static void quickSort(int[] arr,int left ,int right){
        int l =left;//左下标
        int r=right;//右下标
        int middle=arr[(left+right)/2];//中轴值
        int temp=0;//定义一个临时变量
        //while循环目的:比middle小的值让左边,比middle大的值放右边
        while(l<r){
            //从中轴值middle左边开始查找,找到>=中轴值middle才退出
            while(arr[l]<middle){
                l+=1;
            }
            //从中轴值middle右边开始找,找到<=中轴值middle才推出
            while(arr[r]>middle){
                r-=1;
            }
            //如果左边下标(l) >= 右边下标(r),说明中轴值middle的左右俩边的值已经按照
            //左边全部都是 <= middle 的值,右边全部都是 >= middle的值
            if(l >= r){
                break;
            }
            //交换
            temp=arr[l];
            arr[l]=arr[r];
            arr[r]=temp;

            //如果交换完后,发现这个arr[l] == middle 相等 r--, 前移
            if(arr[l] == middle){
                r-=1;
            }
            //如果交换完后,发现这个arr[r] == middle 相等 l--, 前移
            if(arr[r] == middle){
                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);
        }

    }

}

2、运行main函数,运行结果如下:
java数据结构和算法——快速排序算法示例_第2张图片

五、测试快速排序算法所消耗的时间示例

1、代码

package com.rf.springboot01.dataStructure.sort;

import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;

/**
 * @description: 测试快速排序算法所消耗的时间示例
 * @author: xiaozhi
 * @create: 2020-08-10 22:04
 */
public class QuickSort2 {
    public static void main(String[] args) {
        int arr[] = new int[10000000];
        for(int i=0;i<10000000;i++){//创建一个带有一千万个随机数的数组
            arr[i]= (int) (Math.random()*8000000); //随机生成(0到8000000之间)的数
        }
        Date data1 = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String date1Str = simpleDateFormat.format(data1);
        System.out.println("排序前的时间是=" + date1Str);

        quickSort(arr,0,arr.length-1);

        Date data2 = new Date();
        String date2Str = simpleDateFormat.format(data2);
        System.out.println("排序后的时间是=" + date2Str);
    }
    /**
     * @Description:  快速排序方法
     * @Param: [arr]
     * @Author: xz
     * @return: void
     * @Date: 2020/8/10 21:21
     */
    public static void quickSort(int[] arr,int left ,int right){
        int l =left;//左下标
        int r=right;//右下标
        int middle=arr[(left+right)/2];//中轴值
        int temp=0;//定义一个临时变量
        //while循环目的:比middle小的值让左边,比middle大的值放右边
        while(l<r){
            //从中轴值middle左边开始查找,找到>=中轴值middle才退出
            while(arr[l]<middle){
                l+=1;
            }
            //从中轴值middle右边开始找,找到<=中轴值middle才推出
            while(arr[r]>middle){
                r-=1;
            }
            //如果左边下标(l) >= 右边下标(r),说明中轴值middle的左右俩边的值已经按照
            //左边全部都是 <= middle 的值,右边全部都是 >= middle的值
            if(l >= r){
                break;
            }
            //交换
            temp=arr[l];
            arr[l]=arr[r];
            arr[r]=temp;

            //如果交换完后,发现这个arr[l] == middle 相等 r--, 前移
            if(arr[l] == middle){
                r-=1;
            }
            //如果交换完后,发现这个arr[r] == middle 相等 l--, 前移
            if(arr[r] == middle){
                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);
        }

    }
}

2、运行main函数,运行结果如下:
java数据结构和算法——快速排序算法示例_第3张图片java数据结构和算法——快速排序算法示例_第4张图片

本地计算机,win10系统,8G内存测试带有一千万个随机数的数组,用快速排序耗时大约2秒

你可能感兴趣的:(java数据结构和算法)