package com.Fengkuangjava.分治法;
import java.util.Arrays;
import java.util.Scanner;
/*
快速排序的思想:以一个基准元素,以它为中心将数组分为左边全比它小,右边全比它大
然后递归判断其左边区间,重复上面过程,直到只有一个元素为止
*/
public class 快速排序 {
public static void quickSort(int[] nums,int l,int r){
if (l>=r){
return;
}
int i = l;
int j = r;
int flag = nums[l];
while(i<j){
while(nums[j]>=flag&&i<j){//定位右边第一个要交换的元素
j--;
}
int t;
if (i<j) {
t = nums[i];
nums[i] = nums[j];
nums[j] = t;
}
while(nums[i]<=flag&&i<j){//定位左边第一个要交换的元素
i++;
}
//交换
if (i<j){
t = nums[i];
nums[i] = nums[j];
nums[j] = t;
}
}
quickSort(nums,l,j);//排左边
quickSort(nums,j+1,r);//排右边
}
/*public static void quickSort(int[] nums,int l,int r){
if (l>=r){
return;
}
int i = l-1,j = r+1,x = nums[l];
while(i<j){
do {
j--;
}while(nums[j]>x);
do {
i++;
}while(nums[i]<x);
if (i<j){
int t = nums[i];
nums[i] = nums[j];
nums[j] = t;
}else{//说明一趟已经排好了
quickSort(nums,l,j);
quickSort(nums,j+1,r);
}
}
}*/
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int[] nums = {3,-2,5,8,8,-7,6,9};
quickSort(nums,0,7);
System.out.println(Arrays.toString(nums));
}
}
//快速排序
public class QuickSort {
private static Scanner in= new Scanner(System.in);
public static void main(String[] args){
System.out.print("请输入数组长度:");
int n = in.nextInt();
int[] list = new int[n];
System.out.print("请输入数组元素:");for(int i = 0; i < list.length; i++){
list[i]= in.nextInt();}
quickSort(list, 0, n-1);
System.out.println(Arrays.toString(list));}
public static void quickSort(int[] list,int p,int q){if(p>=q){return;}
//获取分区点下标
int index = getPivot(list,p,q);
quickSort(list, p, index-1);
quickSort(list, index+1, q);}
public static int getPivot(int[] list,int p,int q){
int flag = list[q];//设置下标为p的点为分隔点,对剩余元素进行分隔,大的在后,小的在前
int i = p;for(int j = p; j < q; j++){if(list[j]<flag){//交换i和j下标对应的值
int temp = list[i];
list[i]= list[j];
list[j]= temp;
i++;}}
//交换下标为k和下标为i的元素,即将分隔好的数组整理好
int temp = list[i];
list[i]= list[q];
list[q]= temp;return i;}}