当前位置: 首页 > article >正文

排序算法之快速排序

快速排序的执行流程:
快速排序和其它排序的执行流程不太一样,我们需要以下几步:

首先从序列中选择一个轴点元素(pivot)

  • 假设每次选择0位置的元素为轴点元素,也就是索引为0的元素为轴点元素
    (比如下面这个序列,{6,11,8,2,9,4,1,5,7,10,3}我们选择6这个元素为轴点
    元素,一旦把它定义为轴点元素之后,又怎么做呢?)

然后利用轴点元素pivot将序列分成两个子序列

  • 将小于pivot的元素放在pivot的前面(左侧)
  • 将大于pivot的元素放在pivot的后面(右侧)
  • (也就是说通过这个6把这个序列分隔成两个子序列,如果是等于pivot的元素放在哪一边都行,既然6是我们的轴点元素,它要将我们的序列分成两个子序列,如果是小于6的就放在6的左边,如果是大于6的就放在6的右边,如果是等于6放左放右都可以,如果我们是用6去进行分隔上面的数组会变成:{3,5,1,2 8,7,10,11}
    首先pivot指向的是array[0]。也就是pivot = 6;首先是end–;然后end指向了3。因为array[end]<pivot,所以这个时候3应该换到数组的左边来,
    也就是array[0] = array[end] = 3; 这个时候数组就变成了{3,11,8,2,9,4,1,5,7,10,3}这个时候begin也得begin++ 因为begin必须要指向未进行快排的值然后因为右边的数组放到左边,所以现在交换移动的方向,这个时候比较array[begin]和pivot的值
    因为array[begin]==array[1]=11>pivot,因为这个值比轴点元素大,所以直接交换array[end] = array[begin] = 11这个时候数组就变成了{3,11,8,2,9,4,1,5,7,10,11}。然后交换移动方向 先end-- 然后再比较array[end]和pivot,因为pivot<array[end]=10,所以继续执行end–,继续end向前

最后递归的对子序列进行上面的操作

package com.lut.recursion;

import java.util.Arrays;

public class QuickSort {

    public static void sort(int begin,int end,int [] arr){
        if(end - begin<2) return;
        int mid = pivotIndex(begin,end,arr);
        sort(begin,mid,arr);
        sort(mid+1,end,arr);
    }

    private static int pivotIndex(int begin, int end, int[] arr) {
        int pivot = arr[begin];

        while (end>begin){
            while (end>begin){
                if(pivot>arr[end]){
                    arr[begin++] = arr[end];
                    break;
                }else{
                    end--;
                }
            }

            while (end>begin){
                if(pivot<arr[begin]){
                    arr[end--] = arr[begin];
                    break;
                }else{
                    begin++;
                }
            }
        }
        arr[begin] = pivot;
        return begin;
    }

    public static void main(String[] args) {
        int[] array = {5, 2, 9, 1, 5, 6};
        sort( 0, array.length - 1,array);

        System.out.println("Sorted array: " + Arrays.toString(array));
    }
}

http://www.kler.cn/news/330619.html

相关文章:

  • 【Qt】控件概述 (1)
  • MySQL 分组
  • 完美解决Idea中如何对Java Agent进行断点调试的方式
  • 动态规划
  • Stream流的中间方法
  • 本地生活服务项目有哪些:如何利用本地生活市场,打开线下流量!
  • oracle 定时任务每月27号到月底
  • 信息安全工程师(13)网络攻击一般过程
  • 【分布式微服务云原生】Docker常用命令指南
  • 【预备理论知识——1】深度学习:概率论概述
  • Redis入门第五步:Redis持久化
  • 什么是“0day漏洞”?
  • 【leetcode】 45.跳跃游戏 ||
  • 如何快速自定义一个Spring Boot Starter!!
  • 更新-Python OS
  • 基于SpringCloud的微服务架构下安全开发运维准则
  • Linux -- 文件系统(文件在磁盘中的存储)
  • 滚雪球学Oracle[6.1讲]:高级特性与实战案例
  • JZ2440开发板——代码重定位
  • PHP反序列化8(phar反序列化)