1、老版本快速排序
package com.leecode.leecodeTest.sort;
/**
* @author Mr.Lan
* @version 1.0
* @ClassName QuickSort$
* @description TODO
* @date 2025/2/23 21:18
**/
public class QuickSort {
public static void main(String[] args) {
int[] nums = new int[]{1, 34, 455, 3, 2};
quickSort(nums, 0, nums.length - 1);
for (int num : nums) {
System.out.println(num);
}
}
private static void quickSort(int[] nums, int l, int r) {
if (l < r) {
int pos = partition(nums, l, r);
quickSort(nums, l, pos - 1);
quickSort(nums, pos + 1, r);
}
}
static int partition(int[] nums, int l, int r){
int left=l;
int number=nums[l];
//一定要是从右开开始 最后temp和相遇节点交换 从右开始保证了相遇节点小于等于 temp 右边的都大于 左边的都小于
while(l<r){
while(nums[r]>=number&&l<r)
r--;
while(nums[l]<=number&&l<r)
l++;
// 此时左右交换
int temp=nums[l];
nums[l]=nums[r];
nums[r]=temp;
}
//交换节点
nums[left]=nums[l];
nums[l]=number;
return l;
}
}
ps:对于所有数都相同会出现死循环
2、新版本快速排序
package com.leecode.leecodeTest.sort;
/**
* @author Mr.Lan
* @version 1.0
* @ClassName QuickSort$
* @description TODO
* @date 2025/2/23 21:18
**/
public class QuickSortNew {
public static void main(String[] args) {
int[] nums = new int[]{1, 34, 455, 3, 2};
quickSort(nums, 0, nums.length - 1);
for (int num : nums) {
System.out.println(num);
}
}
private static void quickSort(int[] nums, int l, int r) {
if (l < r) {
int pos = partition(nums, l, r);
quickSort(nums, l, pos - 1);
quickSort(nums, pos + 1, r);
}
}
static int partition(int[] nums, int l, int r){
int i=l-1;
int povi=nums[r];
for(int j=l;j<r;j++){
if(nums[j]<povi){
swap(nums,++i,j);
}
}
swap(nums,i+1,r);
//还要交换一次 i+1索引左边一定是小于povi的 而基准元素不一定小于I+1索引的元素
return i+1;
}
static void swap(int[] nums, int l, int r){
int temp=nums[l];
nums[l]=nums[r];
nums[r]=temp;
}
}
3、算法题解
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
List<Integer> list1=new ArrayList<Integer>();
while(scanner.hasNextInt()){
list1.add(scanner.nextInt());
}
List<Integer> list=list1.subList(0,list1.size()-1);
int k=list1.get(list1.size()-1);
int[] array=list.stream().mapToInt(Integer::intValue).toArray();
int res= new Main().getSeventh(array,k);
System.out.println(res);
}
int getSeventh(int[] nums,int k){
quickSort(nums,0,nums.length-1);
return nums[k-1];
}
void quickSort(int[] nums,int l,int r){
if(l<r){
int povi=partition(nums,l,r);
quickSort(nums,l,povi-1);
quickSort(nums,povi+1,r);
}
}
int partition(int[] nums,int l,int r){
int i=l-1;
int povi=nums[r];
for(int j=l;j<r;j++){
if(nums[j]<povi)
swap(nums,j,++i);
}
swap(nums,++i,r);
return i;
}
void swap(int[] nums,int l,int r){
int temp=nums[l];
nums[l]=nums[r];
nums[r]=temp;
}
}
思路:使用快速排序