[排序算法]-拿捏快速排序法

基本介绍

使小于选定基准的数据在左边,大于的在右边,而后分而治之。

——爱因斯坦

核心思想

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

实例讲解

主要思路

  • 当左侧下标小于右侧下标时,将基准元素放置到对应位置(使得其左侧值均小于等于它,右侧值均大于等于它),然后递归的快速排序基准值左侧的子数组和右侧的子数组;
  • 如何将基准值放置到对应位置?默认基准值为最左侧元素,首先从右侧开始遍历,如果右侧值大于等于基准值那么将右侧指针左移,直到满足右侧元素小于基准值时将其赋值给左指针位置;然后比较左侧元素与基准值的大小,如果左侧元素小于等于基准值则右移指针,直到左侧元素大于基准值,将其赋值给右侧指针位置;最终左侧指针位置与右侧位置指针重合时将基准值赋值过来即可。
  • 具体结合代码实现消化

图示演示

将基准值放置到对应位置图示

在这里插入图片描述

快速排序整体过程图示

在这里插入图片描述

代码实现

Talk is cheap, show me the code.

import java.io.*;
import java.util.*;

// Author:Peiliang Gong
// quickSort.
class Sort
{   
    //main function
	public static void main (String[] args) throws java.lang.Exception
	{
		int[] arr = {3,-1,56,0,0,0,7,-3,2,-4};
		quickSort(arr, 0, arr.length-1);
		System.out.println("排序后的结果为:"+Arrays.toString(arr));
		
	}
	private static void quickSort(int[] arr, int left, int right) {
	    if(left < right){
	        int partition = partition(arr, left, right);
	        quickSort(arr, left, partition-1);
	        quickSort(arr, partition+1, right);
	    }
	    
	}
	//一次划分,将基准点放置在对应的位置并返回位置索引
	public static int partition(int[] arr, int left, int right){
	    
	    int pivot = arr[left];
	    while(left < right){
	        while(left < right && arr[right] >= pivot){
	            right--;
	        }
	        arr[left] = arr[right];
	        while(left < right && arr[left] <= pivot){
	            left++;
	        }
	        arr[right] = arr[left];
	    }
	    arr[left] = pivot;
	    return left;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值