Java之快速排序

快速排序

快速排序(Quick Sort)算法,简称快排,利用的是分治的思想。

快速排序思路:

​ 如果要对 first->end 之间的数列进行排序,我们选择 first->end 之间的任意一个元素数据作为分区点(轴值Pivot),然后遍历 first->end 之间所有元素,将小于pivot 的元素放到左边,大于pivot的元素放到右边,pivot放到中间,这样整个数列就被分成了三部分。first->i-1 之间的元素是小于 pivot 的,中间是 pivot,i+1->end 之间的元素是大于 pivot 的。然后再根据分治递归的思想处理两边区间的元素数列,直到区间缩小为 1,整个数列就有序了。

具体可见下图:

排序算法核心:

  1. 确定轴值,一般取序列中第一位置值
  2. 找到序列中轴值所在位置,放置轴值
  3. 将小于轴值的所有元素往轴值前面放置,大于轴值的元素往轴值后面放置

具体代码实现如下:

java 复制代码
import java.util.Arrays;
import org.junit.Test;

/**
 * 
* @ClassName: QuickSort
* @author shaoyb
* @date 2020年12月8日
* @Description: 快速排序
* 快速排序算法思想
* 	1、将序列中第一个元素,设置为"轴值"
	2、对序列排序,所有比轴值小的元素摆放在轴值前面,比轴值大的摆在轴值后面(相同的数可以到任一边)。这样子操作完成后,该轴值就处于数列的中间位置,以上过程称为分区(partition)操作。
	3、对轴值前的子序列和轴值后的子序列进行递归快速排序。
 */
import java.util.Arrays;

public class QuickSort {
	//获取轴值的位置,并轴值为基准点调整序列位置
    public int partition(int arr[],int first,int end)
    {
        int i = first;
        int j = end;

        //默认轴值为 arr[i];
        while(i<j){
            //让j从后往前移动
            while(i<j && arr[i] <= arr[j])
                j--;
            if(i < j){
                //交换i j位置的值
                swap(arr,i,j);
                //更新i的值
                i++;
            }

            //让i从前往后移动
            while(i < j && arr[i] <= arr[j])
                i++;
            if(i < j){
                //再次交换i j位置的值
                swap(arr,i,j);
                j--;
            }
        }

        return i;
    }

    //快速排序
    public void quickSort(int arr[],int start,int end)
    {
        if(start >= end)
            return;

        //先分段
        int index = partition(arr,start,end);

        //对前半截快速排序
        quickSort(arr,start,index-1);

        //对后半截快速排序
        quickSort(arr,index+1,end);
    }

	//交换数组中两个元素
	private void swap(int[] arr, int i, int j) {
		int temp = arr[j];
		arr[j] = arr[i];
		arr[i] = temp;
	}
	
	public static void main(String[] args) {
		int[] array = {3,7,9,1,2,6};
		
		System.out.println("排序前: "+ Arrays.toString(array));

		TestSort t = new TestSort();
		t.quickSort(array, 0, array.length-1);
		
		System.out.println("排序后: "+ Arrays.toString(array));
	}
}
相关推荐
水云桐程序员1 小时前
C++可以写手机应用吗
开发语言·c++·智能手机
测试员周周1 小时前
【AI测试智能体】为什么传统测试方法对智能体失效?
开发语言·人工智能·python·功能测试·测试工具·单元测试·测试用例
RSTJ_16252 小时前
PYTHON+AI LLM DAY THREETY-NINE
开发语言·人工智能·python
想学习java初学者2 小时前
SpringBoot整合Vertx-Mqtt多租户(优化版)
java·spring boot·后端
AC赳赳老秦3 小时前
政企内网落地:OpenClaw 离线环境深度适配方案,无外网场景下本地化模型对接与全功能使用
java·大数据·运维·python·自动化·deepseek·openclaw
赏金术士3 小时前
Kotlin 从入门到进阶 之函数模块(核心基础)(二)
android·开发语言·kotlin
weixin_449173653 小时前
在 Java 中,‌线程安全的 List‌ 主要有以下几种实现方式,它们的效率取决于具体的使用场景(尤其是读写比例):
java·线程安全的list
砚底藏山河3 小时前
股票数据API接口:如何获取股票历历史分时KDJ数据
java·python·maven
MegaDataFlowers4 小时前
运行若依项目
java
加号34 小时前
【Qt】 应用程序发布:依赖库拷贝与部署指南
开发语言·qt