排序算法---(三)

引言

紧接上次排序文章的希尔排序、简单选择排序,今天再来讲两种排序:快速排序、归并排序

快速排序

1.思路

(1)定义一个基准数值(暂且为数组的第一个元素),并定义 i 和 j 两个游标,指向数组的两端

(2)j 在数组最右端,向左移找比基准数值小的元素,找到后停止

(3)i 在数组最左端,向右移找比基准数值大的元素,找到后停止

(4)若 i 和 j 不相遇,交换各自指向的元素,重复直到 i 和 j 相遇

(5)相遇后,说明 i 和 j 共同指向的位置左边均小于基准数值,右边均大于基准数值,因此将基准数值和 i 或 j 指向的元素进行交换

(6)以基准数值为界,再对左右两个数组进行上述流程,直到拆分成一个元素为一组时停止

这里博主依旧手写一份过程,帮助大家理解(仅展示一轮):

2.关键点

第六步提到了拆分成左右两个数组,再次进行前五步的过程,说起来容易,要怎么实现呢?这就用到了递归,就是再次调用自身函数,因为前五步的流程都是一样的,只需要改变"数组"的left和 right 即可

3.代码

java 复制代码
public class QuickSort {
    public static void main(String[] args) {

        int[] arr = {3,2,1,5,4,6,7,8,9,10};

        quickSort(arr,0,arr.length-1);

        for(int i = 0;i<arr.length;i++){
            System.out.print(arr[i]+" ");
        }
    }
    public static void quickSort(int[] arr,int left,int right){
        if(left >= right){
            return;
        }

        //1.定义基准数值
        int base = arr[left];

        //2.定义出i和j;两个游标
        int i = left;
        int j = right;
        while(i<j){
            while(arr[j] >= base && i<j){
                j--;
            }
            while(arr[i] <= base && i<j){
                i++;
            }
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }

        //相遇位置的数和基准数值交换
        arr[left] = arr[i];
        arr[i] = base;

        quickSort(arr,left,i-1);
        quickSort(arr,i+1,right);
    }
}

归并排序

1.思路

先拆分再合并

拆分:把每个元素都拆开拆分,还是像快速排序一样调用自身实现拆分,

合并:用临时空间 temp 来存储每次合并的结果,并且定义一个指针 index 来将合并的元素依次放入临时数组 temp ,在合并过程需要进行大小比较:对合并的两个数组,分别有两个指针 s1、s2 来指向对应数组的第一个元素,将两个指针 s1 、s1 指向的元素进行比较,小的放在index 指向的临时数组的位置,以此类推,这样就实现了两个数组的合并(有序的放入临时空间)

这里博主手写一份过程,来帮大家理解:

2.代码

java 复制代码
public class MergeSort {
    public static void main(String[] args) {

        int[] arr = {3,2,1,5,4,6,7,8,9,10};

        sort(arr,0,arr.length-1);

        for(int i = 0;i<arr.length;i++){
            System.out.print(arr[i]+" ");
        }
    }
    public static  void sort(int[] arr,int left,int right){
        if(left == right){
            return;
        }
        int mid = (left+right)/2;
        sort(arr,left,mid);
        sort(arr,mid+1,right);
        //合并
        merge(arr,left,mid,right);
    }
    public static void merge(int[] arr,int left,int mid,int right){
        int temp[] = new int[right-left+1];
        int s1 = left;
        int s2 = mid+1;
        int index = 0;
        while(s1<=mid && s2<=right){
            if(arr[s1]<arr[s2]){
                temp[index] = arr[s1];
                s1++;  index++;
            }else{
                temp[index] = arr[s2];
                s2++; index++;
            }
        }
        while(s1<=mid){
            temp[index] = arr[s1];
            s1++;  index++;
        }
        while(s2<=right){
            temp[index] = arr[s2];
            s2++; index++;
        }

        for(int j = 0;j<temp.length;j++){
            arr[j+left] = temp[j];
        }
    }
}
相关推荐
江畔柳前堤2 小时前
大语言模型分布式训练:从并行策略到万卡工程的系统梳理
人工智能·分布式·深度学习·算法·目标检测·机器学习·语言模型
Doraemomo2 小时前
数据结构-环形链表
java·数据结构·链表
Forever Nore3 小时前
LeetCode 4 寻找两个正序数组的中位数 - 二分
算法·leetcode
罗西的思考5 小时前
【OpenClaw具身硬件】MiniClaw 阅读笔记---(1)基础
人工智能·算法·机器学习
蛋先生DX5 小时前
大模型参数存储格式揭秘:BF不是男朋友
深度学习·算法·llm
爱跳舞的烤冷面6 小时前
自学嵌入式第22天(数据结构——哈希)
数据结构·算法·哈希算法
猎嘤一号6 小时前
博弈论(Game Theory)的理论、算法与工程
人工智能·算法·安全·博弈论
月光船幽幽6 小时前
影子模式下保护 logits 不被修改
人工智能·python·算法
马拉AI6 小时前
腾讯开源 Agent 记忆系统,AI“换对话就忘”的问题有了新解法(附安装使用教程)
人工智能·算法·开源·科研
MC皮蛋侠客8 小时前
Redis 系列(一):全景与最小闭环——从 `SET` 命令到内存数据结构
数据结构·数据库·redis