快速排序算法

快速排序算法步骤:
1、首先找到数组的基准数(一般是数组的第一位数)
2、定义左右两个指针,用于比较与基准数的大小,进行分区操作,小的放在左区,大的放在右区
3、对左右两区不断进行比较分区操作,直到每一个子集直有一个元素,即为全部有序

例题解析:
sum={26,38,95,86,23,15,59,82,51,41,62,75,89};

  1. 首先定义基准数:temp=26
    左右指针:left=0,right=sum.length-1
    在这里插入图片描述
  2. 此时基准数所在位置的数值可改变,首先判断指针right所指数值与基准数temp的大小,小于基准数则放在基准数所在位置,大于则在原地不动,然后right- -;
    在这里插入图片描述
  3. 此时right所指的数值小于基准数temp,换在基准数所在位置,然后左指针left++;
    在这里插入图片描述
  4. 然后比较左指针所指数值与基准数temp的大小,大于则换在right所指位置,然后right- -;
    在这里插入图片描述
  5. 此时right所指位置的数值小于基准数temp,换在left所在位置,left++;在这里插入图片描述
  6. 此时left所指数值大于基准数temp,换位,right- -;在这里插入图片描述
  7. 此时right所指数值大于基准数temp,无需移动。基准数填在left所在位置;在这里插入图片描述
  8. 将基准数temp左右两边进行分区;如图所示:
    在这里插入图片描述
    在这里插入图片描述
  9. 分别对两个分区进行再划分,直到每一个子集只有一个元素(此时即为有序)。

部分代码解析

分区操作的实现:

//使用循环实现分区操作
		while(left<right)
		{
			//1.右指针左移,找到第一个小于基准值的数arr[right]
			while(left<right && arr[right]>=num)
			{
				right--;
			}
			//2.将右侧找到的小于基准值的数填到left=0的位置,左指针右移left++
			if(left<right)
			{
				arr[left]=arr[right];
				left++;
			}
			//3.左指针右移,找到第一个大于等于基准值的数arr[left]
			while(left<right && arr[left]<num)
			{
				left++;
			}
			//4.将左侧找到的大于等于基准值的数填到right的位置,右指针左移right--
			if(left<right)
			{
				arr[right]=arr[left];
				right--;
			}
		}
		//确定基准值的最终位置
		arr[left]=num;

递规调用实现左右分区:

if(low<high)
		{
			//分区操作,将一个数组分成两个分区,返回分区界限的索引值
			int index=paratition(arr,low,high);
			//对左分区进行排序
			sort(arr,low,index-1);
			//对右分区进行排序
			sort(arr,index+1,high);
		}

完整代码:

import java.util.Arrays;

/**
 * 快速排序算法
 * @author 17628
 *
 */
public class sortquick {

	private static int paratition(int[] arr, int low, int high) {
		//定义左右指针left,right
		int left=low;
		int right=high;
		//定义基准数(数组第一位数)
		int num=arr[left];
		//使用循环实现分区操作
		while(left<right)
		{
			//1.右指针左移,找到第一个小于基准值的数arr[right]
			while(left<right && arr[right]>=num)
			{
				right--;
			}
			//2.将右侧找到的小于基准值的数填到left=0的位置,左指针右移left++
			if(left<right)
			{
				arr[left]=arr[right];
				left++;
			}
			//3.左指针右移,找到第一个大于等于基准值的数arr[left]
			while(left<right && arr[left]<num)
			{
				left++;
			}
			//4.将左侧找到的大于等于基准值的数填到right的位置,右指针左移right--
			if(left<right)
			{
				arr[right]=arr[left];
				right--;
			}
		}
		//确定基准值的最终位置
		arr[left]=num;
		//返回索引值
		return left;
	}
	private static void sort(int[] arr, int low, int high) {
		if(low<high)
		{
			//分区操作,将一个数组分成两个分区,返回分区界限的索引值
			int index=paratition(arr,low,high);
			//对左分区进行排序
			sort(arr,low,index-1);
			//对右分区进行排序
			sort(arr,index+1,high);
		}
	}
	public static void sort(int []arr) {
		int low=0;
		int high=arr.length-1;
		sort(arr,low,high);
	}
	public static void main(String[] args) {
		//定义排序数组
		int []sum={15,26,38,95,86,23,59,82,51,41,62,75,89};
		//输出初始数组
		System.out.println("排序前数组:"+"\n"+Arrays.toString(sum));
		//定义快速排序算法进行排序
		sort(sum,low,high);
		//输出排序后数组
		System.out.println("排序后数组:"+"\n"+Arrays.toString(sum));
	}
}

运行结果如下:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值