使用java实现快速算法

使用java实现快速算法

快速排序是一种基于分而治之的排序算法,其中:
1、通过从数组中选择一个中心元素将数组划分成两个子数组,在划分数组时,将比中心元素小的元素放在左子数组,将比中心元素大的元素放在右子数组

中心元素:也叫枢轴元素、基元,基准元素,这里就叫做中心元素。简单来说就是一个对照的数。

2、左子数组和右子数组也使用相同的方法进行划分,这个过程一直持续到每个子数组都包含一个元素为止。
3、最后,将元素组合在一起以形成排序的数组。

快速排序算法的工作原理

以一个数组为例:[6,1,2,7,9,3,4,5,10,8]
1.首先选择一个中心元素,选取的中心元素不同,算法也会有所不同。这里以选择第一元素为例。
[6,1,2,7,9,3,4,5,10,8]

(1)首先,定义两个变量,用于指向数组的头和尾,并将中心元素赋值给中间变量。

int low=0,height=9,temp;
temp=arr[low];

(2)然后,先从右边往左边开始,找到一个比中间元素6小的数,然后从左边往右边找,找到一个比6大的数,然后将这两个数进行交换。直到low > height,然后将arr[height]的值与中间元素进行交换。

为什么不拿arr[low],因为比较的时候,low下标代表的值就是比中间元素小的,而到最后一次的时候(low > height),说明height下标的值才是比中间元素小的,因此将arr[height]的值与中间元素进行交换。

第一次:
从右往左:5比6小,height指在5的位置
从左往右:7比6大,low指在7的位置
下标为low和height的元素进行交换
[6,1,2,5,9,3,4,7,10,8]

由于low<height,因此继续进行,只要从右边往左找到一个数小于6的,左边往右找到一个数大于6的,就交换两数。直到low > height 为止。

然后
arr[start]=arr[end];
arr[end]=temp;
这时,中间元素的左边将是比中间元素小的数,右边都是比中间元素大的数。

最后,执行下面两条语句,进行递归:
quick(arr,low,height-1);
quick(arr,height+1,end);

quick(arr,low,height-1);
进行第一次后,得到的中间元素的左边都是混乱,不过都是比中间元素小的数。将左边部分的子数组元素的low,height传进quick方法里面进行上面的操作,最后得到的就是从小到大排好的数。

quick(arr,height+1,end);同上述解释quick(arr,low,height-1);一样的原理,只不过传的是右边子数组的low,height。

代码实现:

import java.util.Scanner;

public class Quick {
	public static void main(String[] args) {
		System.out.println("请输入10个整数:");
		Scanner sc = new Scanner(System.in);
		int[] n=new int[10];
		for (int i = 0; i < n.length; i++) {
			n[i]=sc.nextInt();
		}
		quick(n,0,n.length-1);
		for (int i = 0; i < n.length; i++) {
			System.out.print(n[i]+" ");
		}

	}

	public static void quick(int[] arr,int low,int height){
		int start,end,temp,temps;
		if (low>height){
			return;
		}
		start=low;
		end=height;
		temp=arr[start];
		while (start<end){
			while (temp<arr[end] && start<end){
				end--;
			}
			while(temp>arr[start]  && start<end){
				start++;
			}

			if (start<end){
				temps=arr[end];
				arr[end]=arr[start];
				arr[start]=temps;
			}
		}
		arr[start]=arr[end];
		arr[end]=temp;
		quick(arr,low,height-1);
		quick(arr,height+1,end);
	}
}

实现结果:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值