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

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

  1. 基本介绍
    快速排序(Quicksort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列
  2. 排序示意图
    在这里插入图片描述
  3. 代码实现
package com.datastrucate.sort;

import java.util.Arrays;

/**
 * ClassName:QuickSort
 * Package:com.datastrucate.sort
 * Description:
 *
 * @Date:2021/5/14 15:15
 * @Author:hm
 */
public class QuickSort {

    public static void main(String[] args) {

        int [] arr = { -9,78,0,-567,23,70};
        System.out.println("希尔排序前:"+ Arrays.toString(arr));
        //shellSortSwap(arr);
        quickSort(arr,0,arr.length-1);
        System.out.println("希尔排序后:"+ Arrays.toString(arr));

       /* int[] arr = new int [80000];
        //生成8万个随机数
        for (int i = 0;i < 80000;i++){
            arr[i] = (int)(Math.random()*80000);//范围为[0,80000)
        }
        long start = System.currentTimeMillis();
        quickSort(arr,0,arr.length-1);//23毫秒
        long end = System.currentTimeMillis();
        System.out.println("用时:"+(end-start)+"毫秒");*/
    }


    /*
     * 快速排序算法:
     * 原理:快速排序算法(递归)从left排到right,
     * (1)arr[left]作为标注数,
     * (2)循环右边将小数放在左边,循环左边将大数放在右边,直到左右下标重合
     * (3)将标注数赋给当前重合的下标数,递归排序左右两边的数
     */
    public static void quickSort(int[] arr,int left,int right){

        if(left < right) {//递归结束条件
            int state =arr[left];//把数组中的第left+1个数作为标注数
            //记录需要排序的下标
            int low = left;
            int high = right;
            //循环找出比标注数大的数和比标注数小的数
            while (low < high) {
                //若右边下标数比标注数大则右边下标左移
                while (low < high && arr[high] >= state) {
                    high--;
                }
                //否则将右边的小数替换左边的数
                arr[low] = arr[high];

                //若左边的数小于标注数,则左边的下标右移
                while(low < high && arr[low] <= state){
                    low++;
                }
                //否则将左边的数替换右边所指定的下标数
                arr[high] = arr[low];
            }
           //把标注数替换到左右下标重合的位置,即放在中间位置,此处就将数分割为两部分,左边数小于states,右边数大于states
            arr[low] = state;//arr[high] = states
            //分成两部分(递归)中间值为标注数
            //排序小的一部分
            quickSort(arr, left, low);
            ///排序大的一部分
            quickSort(arr, low +1, right);
        }

    }

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值