十大排序算法(Java版)

本文详细介绍了四种基本排序算法:冒泡排序、选择排序、直接插入排序和快速排序。提供了每种算法的流程图、Java代码示例,并对其时间复杂度、空间复杂度进行了深入分析。快速排序尤其突出,时间复杂度为O(nlogn),适用于大规模数据。
摘要由CSDN通过智能技术生成

总览

在这里插入图片描述
在这里插入图片描述

维基百科词条:
在这里插入图片描述

冒泡排序

流程图

在这里插入图片描述

Java代码

    //冒泡排序
    public void bubleSort(int arr[]){
        int len=arr.length;
        for(int i=1;i<arr.length;++i){
            for(int j=0;j<len-i;++j){
                if(arr[j+1]<arr[j]){
                    int temp=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=temp;
                }
            }
        }
    }

复杂度分析

时间复杂度为O( N 2 N^2 N2),空间复杂度为O( 1 1 1),该排序算法是稳定的

选择排序

流程图

思路:从0索引处开始,依次和后面的元素进行比较 ,小的元素往前放,经过一轮比较后,最小的元素就放在了最小索引处,每经过一轮比较,索引位置 + 1。
在这里插入图片描述

Java代码

    //选择排序
    public static void selectSort(int[] arr) {
        int len=arr.length;
        for(int i=0;i<len-1;++i){
            for(int j=i+1;j<len;++j){
                if(arr[i]>arr[j]){
                    int temp=arr[i];
                    arr[i]=arr[j];
                    arr[j]=temp;
                }
            }
        }
    }

复杂度分析

时间复杂度为O( N 2 N^2 N2),空间复杂度为O(1),该排序算法是不稳定的

直接插入排序

流程图

在这里插入图片描述

Java代码

    //插入排序
    public static void insertSort(int[] arr){
        int len=arr.length;
        for(int i=1;i<len;++i){
            for(int j=i;j>0;--j){
                if(arr[j]<arr[j-1]){
                    int temp=arr[j];
                    arr[j]=arr[j-1];
                    arr[j-1]=temp;
                }
            }
        }
        return;
    }

复杂度分析

时间复杂度为O( N 2 N^2 N2),空间复杂度为O(1),该排序算法是稳定的。

快速排序

算法描述

参考B站:https://www.bilibili.com/video/BV15b4y117RJ?p=24

代码实现

单边循环:

class Solution {
    public int[] sortArray(int[] nums) {
        quick(nums,0,nums.length-1);
        return nums;
    }

    public void quick(int[] a,int x,int y){
        if(x>=y) return;
        int pivot=quickSort(a,x,y);
        quick(a,pivot+1,y);
        quick(a,x,pivot-1);
    }

    public int quickSort(int[] a,int x,int y){
        int pivot=a[y];
        int i=x;
        for (int j = i; j < y; j++) {
            if(a[j]<pivot){
                swap(a,i,j);
                i++;
            }
        }
        swap(a,i,y);
        return i;
    }

    public void swap(int[] a,int x,int y){
        int temp=a[x];
        a[x]=a[y];
        a[y]=temp;
    }
}

双边循环:

class Solution {
    public int[] sortArray(int[] nums) {
        quick(nums,0,nums.length-1);
        return nums;
    }

    public void quick(int[] nums,int left,int right){
        if(left>=right)
            return;

        int pivot=quickSort(nums, left, right);
        quick(nums,left,pivot-1);
        quick(nums,pivot+1,right);
    }

    public int quickSort(int[] nums,int left,int right){
        int temp=nums[left];
        int i=left;
        int j=right;
        while (i<j){
            while(i<j && nums[j]>temp)
                j--;
            while(i<j && nums[i]<=temp)
                i++;
            swap(nums,i,j);
        }
        swap(nums,i,left);
        return i;
    }

    public void swap(int[] nums,int i,int j){
        int temp=nums[i];
        nums[i]=nums[j];
        nums[j]=temp;
    }
}

复杂度分析

时间复杂度为O(nlogn),空间复杂度为O(logn), 该算法是不稳定的

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值