P1177 【模板】快速排序(二分法,洛谷,java)

洛谷链接:https://www.luogu.com.cn/problem/P1177
注意:传统快排过不了,必须优化。java中交换函数也和c语言不一样,运用二分法,比传统快排快。

在这里插入图片描述

import java.util.Scanner;

public class Main {
	public static int[] a=new int[100001];
	
	//交换
    private static void swap(int[] data,int i, int j) {
		int temp=data[i];
		data[i]=data[j];
		data[j]=temp;
	}
	
	public static void quicksort(int l,int r) {
		//应用二分思想
		int mid=a[(l+r)/2];  //中间数
		int i=l,j=r;
		do {
			while(a[i]<mid) i++;  //查找左半部分比中间数大的数
			while(a[j]>mid) j--;  //查找右半部分比中间数小的数
			if(i<=j) {
				//如果有一组不满足排序条件(左小右大)的数
				swap(a,i,j);  //交换
				i++;
				j--;
			}
		}while(i<=j);
		
		if(l<j) quicksort(l,j);  //递归搜索左半部分
		if(i<r) quicksort(i,r);  //递归搜索右半部分
	}
	
	public static void main(String[] args) {
        
    	Scanner in=new Scanner(System.in);
		int n=in.nextInt();		
		
		for(int i=1;i<=n;i++) {
			a[i]=in.nextInt();
		}
		quicksort(1,n);
		for(int i=1;i<=n;i++) {
			System.out.print(a[i]+" "); 
		}

    }
}
发布了68 篇原创文章 · 获赞 26 · 访问量 613

猜你喜欢

转载自blog.csdn.net/weixin_44685629/article/details/103842749