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;
}
}