java:快速排序

java:快速排序

题目

问题描述
  快速排序是最经常使用的一种排序方式,对于给定的n个数组成的一个数组,请使用快速排序对其进行排序。
  现给定一序列,请用快速排序将其按升序排序并输出。
输入格式
  第一行一个数N。
  第2~N+1行每行一个数,表示给定序列。
输出格式
  共N行,每行一个数,表示所求序列。
样例输入
5
1
4
2
3
4
样例输出
1
2
3
4
4
数据规模和约定
  共10组数据。
  对100%的数据,N<=10^5,所有数均为非负数且在int范围内。

有点小问题的代码

import java.util.Scanner;

public class 快速排序 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);
		int size=sc.nextInt();
		int[] array=new int[size];
		for(int i=0;i<size;i++){
			array[i]=sc.nextInt();
		}
		quickSort(array,size);//把数组里面进行快排
		for(int i=0;i<size;i++)
			System.out.println(array[i]);
		
	}

	private static void quickSort(int[] array, int size) {
		// TODO Auto-generated method stub
		QSort(array,0,size-1);//我们自己定义的快速排序
	}

	private static void QSort(int[] array, int left, int right) {
		// TODO Auto-generated method stub
		int pivot;//选择轴元素,选中位数,还要换到一个合适的位置
		pivot=medianPivot(array,left,right);
		int i,j;
		i=left+1;
		j=right-2;
		while(true){
			while(array[i]<=pivot)
				i++;
			while(array[j]>=pivot)
				j++;
			if(i<j)
				swap(array[i],array[j]);
			else break;
		}
		
		
	}

	private static int medianPivot(int[] array, int left, int right) {
		// TODO Auto-generated method stub
		int mid=(left+right)/2;//中位数
		if(array[left]>array[mid])
			swap(array[left],array[mid]);
		if(array[left]>array[right])
			swap(array[left],array[right]);
		if(array[mid]>array[right])
			swap(array[mid],array[right]);
		swap(array[mid],array[right-1]);
		return array[right-1];
	}

	private static void swap(int i, int j) {
		// TODO Auto-generated method stub
		int temp=0;
		i=temp;
		i=j;
		j=temp;
	}

}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

这两篇很好,很多都是从这篇文章中明白的
https://juejin.im/post/5d1c039d6fb9a07eb67daa82#heading-6

https://blog.csdn.net/weixin_40608613/article/details/104376791?ops_request_misc=%7B%22request%5Fid%22%3A%22158281403219726869049069%22%2C%22scm%22%3A%2220140713.130056874…%22%7D&request_id=158281403219726869049069&biz_id=0&utm_source=distribute.pc_search_result.none-task

代码

import java.util.Scanner;

public class 快速排序1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);
		int size=sc.nextInt();
		int[] a=new int[size];
		for(int i=0;i<size;i++){
			a[i]=sc.nextInt();
		}
		QSort(a,0,size-1);
		for(int i=0;i<size;i++){
			System.out.println(a[i]);
		}
	}

	private static void QSort(int[] a, int left, int right) {
		// TODO Auto-generated method stub
		if(left>=right)
			return;
		//选择最左边的元素为哨兵
		int pivot=median3(a,left,right);
		int i=left;
		int j=right-1;
		while(i<j){
			//当l指针和r指针都遇到等于pivot的元素时,让这两个指针都停下来
			while(i<j&&pivot>a[++i]){}
			while(i<j&&pivot<a[--j]){}
			if(i<j)
			swap(a,i,j);
		}
		//交换pivot和比pivot小的最后一个元素的值
		swap(a,i,right-1);
		
		QSort(a,left,i-1);
		QSort(a,i+1,right);
		
	}

	private static int median3(int[] a, int left, int right) {
		// TODO Auto-generated method stub
			int mid=(left+right)/2;//中位数
			if(a[left]>a[mid])
				swap(a,left,mid);
			if(a[left]>a[right])
				swap(a,left,right);
			if(a[mid]>a[right])
				swap(a,mid,right);
			swap(a,mid,right-1);
			return a[right-1];
	}

	private static void swap(int[] a, int i, int j) {
		// TODO Auto-generated method stub
		int temp=a[i];
		a[i]=a[j];
		a[j]=temp;
	}

}

但是超时了

在这里插入图片描述

虽然我不懂为什么换成了前面几个就可以不超时,但是我目前不想知道,我先把这个写成这个了

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class 快速排序3 {
	
		public static void main(String[] args)throws Exception {
			// TODO Auto-generated method stub
			BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
			int size = Integer.parseInt(in.readLine());
			int[] a=new int[size];
			for(int i=0;i<size;i++){
				a[i]=Integer.parseInt(in.readLine());
			}
			QSort(a,0,size-1);
			for(int i=0;i<size;i++){
				System.out.println(a[i]);
			}
		}

		private static void QSort(int[] a, int left, int right) {
			// TODO Auto-generated method stub
			if(left>=right)
				return;
			//选择最左边的元素为哨兵
			int pivot=median3(a,left,right);
			int i=left;
			int j=right-1;
			while(i<j){
				//当l指针和r指针都遇到等于pivot的元素时,让这两个指针都停下来
				while(i<j&&pivot>a[++i]){}
				while(i<j&&pivot<a[--j]){}
				if(i<j)
				swap(a,i,j);
			}
			//交换pivot和比pivot小的最后一个元素的值
			swap(a,i,right-1);
			
			QSort(a,left,i-1);
			QSort(a,i+1,right);
			
		}

		private static int median3(int[] a, int left, int right) {
			// TODO Auto-generated method stub
				int mid=(left+right)/2;//中位数
				if(a[left]>a[mid])
					swap(a,left,mid);
				if(a[left]>a[right])
					swap(a,left,right);
				if(a[mid]>a[right])
					swap(a,mid,right);
				swap(a,mid,right-1);
				return a[right-1];
		}

		private static void swap(int[] a, int i, int j) {
			// TODO Auto-generated method stub
			int temp=a[i];
			a[i]=a[j];
			a[j]=temp;
		}

	}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

向上Claire

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值