首页 > 编程语言 >排序算法

排序算法

时间:2023-11-07 10:46:41浏览次数:30  
标签:tmp arr int 复杂度 算法 low 排序

1. 插入类排序

1.1 直接插入排序

class Solution {
    public void insertSort(int[] arr, int n) {
        int tmp;
        for (int i = 1; i < n; i++) {
            // 将待插入的关键字暂存于tmp中
            tmp = arr[i];
            int j = i - 1;
            // 依次从待排关键字之前的关键字进行扫描
            while (j >= 0 && tmp < arr[j]) {
                arr[j + 1] = arr[j];
                --j;
            }
            // 找到插入位置
            arr[j + 1] = tmp;
        }
    }
}

时间复杂度

  • 最坏情况:\(O(n^2)\)
  • 最好情况:\(O(n)\)
  • 平均时间复杂度:\(O(n^2)\)

2. 交换类排序

2.1 冒泡排序

class Solution {
    public void bubbleSort(int[] arr, int n) {
        boolean flag;
        int tmp;
        for (int i = n - 1; i >= 1; i--) {
            // 用flag标记本趟排序是否发生了交换
            flag = false;
            for (int j = 1; j <= i; j++) {
                if (arr[j - 1] > arr[j]) {
                    tmp = arr[j];
                    arr[j] = arr[j -1];
                    arr[j - 1] = tmp;
                    flag = true;
                }
            }
            if (!flag) {
                return;
            }
        }
    }
}

时间复杂度

  • 最坏情况:\(O(n^2)\)
  • 最好情况:\(O(n)\)
  • 平均时间复杂度:\(O(n^2)\)

2.2 快速排序

class Solution {
    public void quickSort(int[] arr, int low, int high) {
        // 对从arr[low]到arr[high]的关键字进行排序
        int tmp;
        int i = low, j = high;
        if (low < high) {
            tmp = arr[low];
            // 将小于tmp的数放左边,将大于tmp的数放右边
            while (i < j) {
                // 从右往左扫描,找到一个小于tmp的数
                while (i < j && arr[j] >= tmp) {
                    --j;
                }
                if (i < j) {
                    arr[i] = arr[j];
                    ++i;
                }
                // 从左往右扫描,找到一个大于tmp的数
                while (i < j && arr[i] < tmp) {
                    ++i;
                }
                if (i < j) {
                    arr[j] = arr[i];
                    --j;
                }
                arr[i] = tmp;
                quickSort(arr, low, i - 1);
                quickSort(arr, i + 1, high);
            }
        }
    }
}

时间复杂度

  • 最坏情况:\(O(n^2)\)
  • 最好情况:\(O(nlog_2n)\)
  • 平均时间复杂度:\(O(nlog_2n)\)

待排序列越接近无序,算法效率越高。

3. 选择类排序

3.1 简单选择排序

class Solution {
    public void selectSort(int[] arr, int n) {
        int tmp;
        for (int i = 0; i < n; i++) {
            int k = i;
            for (int j = i + 1; j < n; ++j) {
                if (arr[k] > arr[j]) {
                    k = j;
                }
            }
            tmp = arr[i];
            arr[i] = arr[k];
            arr[k] = tmp;
        }
    }
}

时间复杂度:\(O(n^2)\)

标签:tmp,arr,int,复杂度,算法,low,排序
From: https://www.cnblogs.com/zwx1123/p/17814482.html

相关文章

  • 商品sku算法
    笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尔积(Cartesianproduct),又称直积,表示为X×Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员实现简单的sku算法`constspec=[['红','白','蓝'],['32G','64G'],['移动','联通','电信']]......
  • 算法刷题记录-螺旋矩阵
    算法刷题记录-螺旋矩阵螺旋矩阵给你一个正整数n,生成一个包含1到n2所有元素,且元素按顺时针顺序螺旋排列的nxn正方形矩阵matrix。示例1:输入:n=3输出:[[1,2,3],[8,9,4],[7,6,5]]示例2:输入:n=1输出:[[1]]思路,这题有点绕,我用了一个比res大2的布尔矩阵来存储......
  • 算法--笔记--单调栈
    单调栈是为了解决两层foru循环O(n^2)变为O(n)的问题思路是:维持一个单调栈.依次进入单调栈,并淘汰对后续没有帮助的对象当一个对象从栈里弹出的时候,结算当前对象参与的答案。如何判断单调栈是大压小还是小压大呢?左侧的要小的,就是大压小左侧的要大的,就是小压大......
  • js日期排序
    letdata=[{id:2,time:'2019-04-2610:53:19'},{id:4,time:'2019-04-2610:51:19'},{id:1,time:'2019-04-2611:04:32'},{id:3,time:'2019-04-2611:05:32'}]//property是你需要排序传入的key,bol为tru......
  • 文心一言 VS 讯飞星火 VS chatgpt (129)-- 算法导论11.1 4题
    四、用go语言,我们希望在一个非常大的数组上,通过利用直接寻址的方式来实现一个字典。开始时该数组中可能包含一些无用信息,但要对整个数组进行初始化是不太实际的,因为该数组的规模太大。请给出在大数组上实现直接寻址字典的方案。每个存储对象占用O(1)空间;SEARCH、INSERT和DELETE操......
  • 文心一言 VS 讯飞星火 VS chatgpt (129)-- 算法导论11.1 4题
    四、用go语言,我们希望在一个非常大的数组上,通过利用直接寻址的方式来实现一个字典。开始时该数组中可能包含一些无用信息,但要对整个数组进行初始化是不太实际的,因为该数组的规模太大。请给出在大数组上实现直接寻址字典的方案。每个存储对象占用O(1)空间;SEARCH、INSERT和DELETE操......
  • 羚通视频智能分析平台石油石化 视频监控识别漏油算法检测
    羚通视频智能分析平台是一款专为石油石化行业设计的高效工具,它能够通过先进的算法进行漏油检测。这款平台利用了人工智能和大数据技术,可以实时监控石油石化设施的运行状态,及时发现并预警可能的漏油风险。在石油石化行业中,漏油是一种常见的安全隐患,如果不及时处理,可能会对环境造成严......
  • 大二算法实验一用循环链表解决约瑟夫环
    题目约瑟夫(Joeph)问题的一种描述是:编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的......
  • sql 多个字段排序问题
    ec_perform_sh_sailing_plan表,上数日期字段shangshuDate;预到日期yuji_daoda_date; 如果上数日期有值,按预到时间降序。如果上数日期没有值,按预到时间升序,上数日期没有值的排在有值的前面;SELECT*FROMec_perform_sh_sailing_planORDERbyCASEWHENshangshuDateISNUL......
  • 数据结构与算法-数组
    什么是数组在每一种编程语言中,基本都会有数组这种数据类型。不过,它不仅仅是一种编程语言中的数据类型,还是一种最基础的数据结构是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据数组的特点低效的插入和删除数组为了保持内存数据的连续性,会导致插入......