快速排序思想:分治
先按照选定基准值x排序 左边一段小于等于x 右边一段大于等于x 后进行区域划分
算法时间复杂度最坏o(n2) 最好(nlogn)
import java.util.*;
//快速排序模板
class Main{
static int N = 100010;
static int[] arr = new int[N];
public static void main(String []args){
Scanner in = new Scanner(System.in);
int n = in.nextInt();
for(int i=0;i<n;i++){
arr[i] = in.nextInt();
}
//对数组进行快速排序
quicksort(0,n-1);
for(int i=0;i<n;i++){
System.out.print(arr[i]+" ");
}
}
public static void quicksort(int l,int r){
if(l>=r) return;
//确定排序基准
int x = arr[l + r >>1];
//把数列分成两端 使左边一段小于等于x 右边一段大于等于x
int i = l -1 ; int j = r + 1;
while(i<j){
do i++;while(arr[i]<x);
do j--;while(arr[j]>x);
if(i<j) swap(i,j);
}
//[l, j] 是 <= x的区域 [j+1,r] 是 >= x的区域
quicksort(l,j);quicksort(j+1,r);
}
public static void swap(int i,int j){
int temp =arr[i];
arr[i] =arr[j];
arr[j] =temp;
}
}
归并排序 思想:分治
先划分后合并,需要辅助数组 算法时间复杂度严格(nlogn)
import java.util.*;
public class Main{
static int N = 100010;
static int[] temp = new int [N];
static int[] arr = new int [N];
public static void main(String []args){
Scanner in = new Scanner(System.in);
int n = in.nextInt();
for(int i=0;i<n;i++){
arr[i] = in.nextInt();
}
mergesort(0,n-1);
for(int i=0;i<n;i++){
System.out.print(arr[i]+" ");
}
}
public static void mergesort(int l,int r){
if(l>=r) return;
int mid = l + r >> 1;
mergesort(l,mid);mergesort(mid+1,r);
//进行归并
int k = 0; int i = l; int j = mid + 1;
while(i<=mid&&j<=r){
if(arr[i]<=arr[j]) temp[k++] = arr[i++];
else temp[k++] = arr[j++];
}
//若有一个归并未成功
while(i<=mid) temp[k++] = arr[i++];
while(j<=r) temp[k++] = arr[j++];
//辅助数组还原
for(i=l,k=0;i<=r;i++,k++){
arr[i] = temp[k];
}
}
}
附:
快速排序算法的亲生兄弟快速选择算法
//快速选择算法 找排序后 数列的第k个数
import java.util.*;
class Main{
static int[] arr= new int[100010];
public static void main(String []args){
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int k = in.nextInt();
for(int i=0;i<n;i++){
arr[i] = in.nextInt();
}
int kk = quick_select(0,n-1,k);
System.out.println(kk);
}
public static int quick_select(int l,int r, int k){
if(l==r) return arr[l];
int x = arr[l+r >> 1];
int i = l-1;int j = r+ 1;
while(i<j){
do i++;while(arr[i]<x);
do j--;while(arr[j]>x);
if(i<j) swap(i,j);
}
int rl = j - l + 1;
if(k<=rl) return quick_select(l,j,k);
if(k>rl) return quick_select(j+1,r,k-rl);
return 0;
}
public static void swap(int i,int j){
int temp = arr[i];
arr[i]=arr[j];
arr[j] = temp;
}
}