常见排序算法模板-基础算法1

本文深入解析了快速排序和归并排序两种经典排序算法的实现原理与过程。快速排序采用分治策略,通过基准元素将数组分为两部分,递归地进行排序,其时间复杂度在最坏情况下为O(n^2),平均情况下为O(nlogn)。归并排序同样基于分治原则,但通过合并两个已排序的子数组来达到排序目的,确保了O(nlogn)的时间复杂度。文章提供了详细的Java代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

快速排序思想:分治
先按照选定基准值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; 
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值