常用排序算法

Java常用排序算法 阅读详情

1.快速排序(使用最常见的排序算法)

算法分析
  • 快速排序是一个分治思想,平均复杂度是n*lg(n)。
    Divide:数组A[p…r]分为两个子数组A[p…q-1],A[q+1…r],使得A[p…q-1]上所有元素小于A[q];A[q+1…r]上所有的元素都大于A[q]。
    Conquer:通过对快排的递归,对两个子数组A[p…q-1]和A[q+1…r]进行排序。
    Combine:分完就已经有序。
实现
//=========快排算法=========
//使得arr[low]..arr[q-1]中的每一个元素都小于等于arr[q], arr[q]也小于等于arr[q+1]..arr[high]。
//简而言之,让左边的数字都小于右边的数字
//最坏时间复杂度:n^2 , 平均时间复杂度:n*lg(n)
//优化:为了使得输入均匀的分布,对输入使用随机数
//排序一个数组,初始调用Qsort(A,0,A.size()-1).
//=========================
int partirtion(int A[],int low,int high){
    int x = A[high];
    int i = low - 1;
    for(int j = low;j < high; j++){
        //左边的数字如果大于右边的数字,就交换位置
        if(A[j] <= x){
            i++;
            //互换A[i]和A[j]
            int tmp = A[i];
            A[i] =A[j];
            A[j] = tmp;
        }
    }
    //将主元(pivot)给到i的下一个
    int temp = A[i+1];
    A[i+1] = A[high];
    A[high] = temp;
    return i+1;
}
void Qsort(int arr[], int low, int high){
    if(low < high){
        int q =partirtion(arr,low,high);
        Qsort(arr,low,q-1);
        Qsort(arr,q+1,high);
    }
}

2.插入排序

算法分析
  • 适用于少量元素的排序,工作方式就像是排序一副扑克牌,每次从右向左对每一张牌进行比较。最坏情况是n2。
实现
//=============插入排序==========
//从插入的位置起步,往前作比较,输入n指长度
//===============================
void insertSort(int A[],int n){
    for(int i = 1;i < n;i++){
        //把A[i]插入到A[1..i-1]中
        int key = A[i];
        int j = i - 1;
        while(j >0 && A[j] > key){
            A[j+1] = A[j];
            j--;
        }
        //j+1就是需要插入的位置
        A[j + 1] = key;
    }
}

3.并归排序

算法分析
  • 归并排序完全按照分治的思想,关键的操作在于合并步骤,需要时间复杂度为n。
实现
//===========归并排序==========
//Merge就是合并的过程,相当于在两堆排好序的牌中,每次选取最上面的两张进行比较,选取其中较小的一张
//A是数组,p<=q<r,Merge过程假设A[p..q]和A[q+1..r]都已经排好序了,元素的总数是:n = r-p+1
//r,q,p都是指的下标
//=============================
void merge(int A[], int p, int q, int r){
    //n1 n2 就是两个新数组的界
    int n1 = q - p +1;
    int n2 = r - q;
    //将这两个赋值为左右两个新数组,最后一个数放入一个最大数作为结尾标志
    int *L = new int[n1+1];
    int *R = new int[n2+1];
    for(int i = 0; i < n1; i++){
        L[i] = A[p+i];
    }
    for(int i = 0; i < n2; i++){
        R[i] = A[q+i+1];
    }
    L[n1] = INT8_MAX;
    R[n2] = INT8_MAX;
    //i记录左边数组的下标,j记录右边数组的下标
    int i = 0, j = 0;
    for(int k = p; k < r; k++){
        if(L[i] <= R[j]){
            A[k] = L[i];
            i++;
        } else{
            A[k] = R[j];
            j++;
        }
    }
}
void mergeSort(int A[], int p, int r){
    if(p < r){
        int q = (p+r)/2;
        mergeSort(A,p,q);
        mergeSort(A,q+1,r);
        merge(A,p,q,r);
    }
}

4.计数排序

算法分析
  • 计数排序的基本思想是:对每一个输入元素x,确定小于x的元素个数。利用这个性质就可以直接把x放到指定输出数组的位置上了。适用于数组中的元素都小于数组中的最大元素的情况。
实现
//===========计数排序==============
//函数输入为:input输入数组、n是输入和输出数组的长度、k是数组中的最大数
//================================
void countSort(int input[], int n, int k){
    int* counter = new int[k+1];
    int* output = new int[n];
    //初始化计数器
    for(int i = 0; i <= k;i++){
        counter[i] = 0;
    }
    //记录输入有多少个当前counter下标的值
    for(int i = 0;i < n;i++){
        counter[input[i]]++;
    }
    //对每一个下标记录与之前的求和,求和的结果就是下标在输出数组的位置
    for(int i = 1; i <= k;i++){
        counter[i] = counter[i]+counter[i-1];
    }
    //通过计数器寻址,对输出赋值
    for(int i = n-1;i >=0;i--){
        //个数还需要减1,成为下标
        output[counter[input[i]]-1] = input[i];
        counter[input[i]]--;
    }
    //将输出给输入
    for(int i = 0;i < n;i++){
        input[i] = output[i];
    }
}

5.基数排序

算法分析
  • 基数排序是对每一个数的每一位进行排序,运行时间为n,比快排的n*lg(n)要好。
实现
//=========基数排序===============
//先求出所有数中最大数字的位数
//再根据键值的每一位数字,来分配一个桶
//===============================
int maxbit(int data[], int n) //辅助函数,求数据的最大位数
{
    int maxData = data[0];              ///< 最大数
    /// 先求出最大数,再求其位数,这样有原先依次每个数判断其位数,稍微优化点。
    for (int i = 1; i < n; ++i)
    {
        if (maxData < data[i])
            maxData = data[i];
    }
    int d = 1;
    int p = 10;
    while (maxData >= p)
    {
        //p *= 10; // Maybe overflow
        maxData /= 10;
        ++d;
    }
    return d;
}
void radixsort(int data[], int n) //基数排序
{
    int d = maxbit(data, n);
    int *tmp = new int[n];
    int *count = new int[10]; //计数器
    int i, j, k;
    int radix = 1;
    for(i = 1; i <= d; i++) //进行d次排序
    {
        for(j = 0; j < 10; j++)
            count[j] = 0; //每次分配前清空计数器
        for(j = 0; j < n; j++)
        {
            k = (data[j] / radix) % 10; //统计每个桶中的记录数
            count[k]++;
        }
        for(j = 1; j < 10; j++)
            count[j] = count[j - 1] + count[j]; //将tmp中的位置依次分配给每个桶
        for(j = n - 1; j >= 0; j--) //将所有桶中记录依次收集到tmp中
        {
            k = (data[j] / radix) % 10;
            tmp[count[k] - 1] = data[j];
            count[k]--;
        }
        for(j = 0; j < n; j++){
            data[j] = tmp[j];
        }

        radix = radix * 10;
    }
    delete []tmp;
    delete []count;
}
若依ruoyi框架实现单点登录或者接入统一认证 log.info("单点登录用户[{}]不存在, 需要创建.", loginName);log.info("单点登录用户[{}]已存在.", loginName);jsonObjectData.put("nickName","单点1");if (code.equals("0")) {//验证成功需要自动登录。jsonObject.put("msg","验证成功");ajax.put("msg", "登录成功"); 阅读详情

相关推荐

ROS学习【11】-----基于ubuntu16.04上Gazebo机器人环境搭建的传感器仿真(camera、kinect、Lidar),并通过Rviz进行数据显示

ROS学习-----基于ubuntu16.04上Gazebo机器人环境搭建的传感器仿真目录一、Gazebo环境搭建前的准备1、将搭建模型下载到我们的gazebo环境下2、升级我们的gazebo版本二、创建配置launch文件参数的world文件1、进入工程包mbot_gazebo2、创建文件夹worlds3、进入该文件夹4、创建playground.world文件5、创建room.world文件三...

qq_42451251的博客 3607

数据结构与算法——排序算法

httpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttps。

Tting_12的博客 377

matlab 用m_map画地形水深图

clear,clc %投影 m_proj('albers equal-area','lat',[5 43],'long',[105 125],'rect','on'); %加载水深文件 [CS,CH]=m_etopo2('contourf',[-7000:500:3000],'edgecolor','none'); %绘制高分辨率陆地和海岸线 m_gshhs_h('patch',[0.1 0.9 ...

qq_44913577的博客 9511

排序算法要点

第一篇: 堆排序 二叉堆满足二个特性: 1).父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值。 2).每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)。 堆排序的三个要点 从小到大排序,要先建立最大堆。 以构建最大堆为例 1.堆调整 以待排序节点开始,遍历子节点,把两个子节点值比较大的子节点向上移动。 两个子节点都比该节点小,说明不用在调节了。注

专心-超越 1194

镜头调焦的 调整的是焦距还是像距?

在镜头 “调焦”(即日常拍照时的)中,调整的核心是,而非焦距。

AIoT深度探索者 | 嵌入式系统架构师 深耕物联网(IoT)与人工智能(AI)融合技术,聚焦​​边缘计算、图像开发、低功耗通信协议​​,致力于智能硬件,关注我获取最新技术文章信息与海量资源~ 1351

VAY 是 SAP 自动科目确定(OBYC-GBB)中的科目修改码,专用于带科目分配对象的销售订单发货场景,核心是触发 “Dr 成本要素科目(如销售费用 / 特定成本对象) Cr 库存商品” 的分录,

摘要:VAY是SAP中用于带科目分配对象(如成本中心、WBS)的销售订单发货的科目修改码,与标准VAX场景不同,它生成"借成本要素科目/贷库存商品"的分录。配置路径为OBYC-GBB-VAY,需确保借方科目为成本要素。典型业务场景包括免费样品、项目专用发货等。常见问题包括VAY未触发或科目记账错误,需检查销售订单科目分配、移动类型设置及OBYC配置。特殊场景建议单独配置科目以便费用分析。

金牌架构师 1253

快速排序算法及其注意事项

在论坛上看到一篇讲快速排序算法的文章,不记得是谁了,然后出于兴趣自己动手学习了一下,下面是一点心得:算法:利用分治思想,每次定义一个主元,然后从前后两个方向进行对比和移动,把数据按照基元为中心,分成两份,前面的为所有大于基于的数,后面的为所有小于基元的数(从小到大排序则相反),然后递归调用,分别再对两侧的数组进行排序,直到顺序排好为止。 代码: 1 /******************...

weixin_30583563的博客 441

【WRF理论第十四期】 VEGPARM.TBL 文件详解

WRF 读取 VEGPARM.TBL 文件

WW、forever的博客 576

各种排序算法总结和比较

排序算法可以说是一项基本功,解决实际问题中经常遇到,针对实际数据的特点选择合适的排序算法可以使程序获得更高的效率,有时候排序的稳定性还是实际问题中必须考虑的,这篇博客对常见的排序算法进行整理,包括:插入排序、选择排序、冒泡排序、快速排序、堆排序、归并排序、希尔排序、二叉树排序、计数排序、桶排序、基数排序。 代码都经过了CodeBlocks的调试,但是很可...

3726

游戏客户端开发工程师部分笔试题解析

你可以选择任意连续K个宝石合并成一个新的宝石,新宝石保持在原队列的位置且它的能量值是这K个宝石能量值之和。给定一个幸运值N=0、一堆包含能量值的宝石,你的任务是找到将所有宝石合并成一个宝石的最大幸运值。2.在一个二维网格中,有一个起点S、一个终点E和一个必须经过的中间点M。C++ 的多态性正是通过基类指针或引用调用派生类覆盖的虚函数实现的,这是运行时多态的核心机制。光线追踪带来的抗锯齿效果是其渲染方法的自然结果,而不是一个独立的算法。宝石具体能量值:[10, 7, 2, 6, 5, 11, 8];

博客 3029

【华为OD机试真题】4、字符统计及重排 | 机试真题+思路参考+代码解析(C++、Java、Py)

题目描述 >给出一个仅包含字母的字符串,不包含空格,统计字符串中各个字母(区分大小写)出现的次数, 并按照字母出现次数从大到小的顺序。输出各个字母及其出现次数。 如果次数相同,按照自然顺序进行排序,且小写字母在大写字母之前

KJ.JK 3289

排序算法总结

一、三种简单的初级排序算法(冒泡、选择、直接插入) 1.冒泡排序 每个数和自己隔壁的数两两对比,就像冒泡一样,右边开始有序,时间复杂度为O(n^2) #include&lt;iostream&gt; using namespace std; int main() { int a[100]; int n; cin&gt;&gt;n; int i,j; ...

力尽山拔的博客 348

Hermes 教程 03:Skills 系统

摘要:Hermes Skills是一种自我改进机制,可将解决问题的经验保存为可复用技能文档。v0.13.0版本遵循agentskills.io开放标准,与Claude Skills互通。技能创建流程包括发现问题、创建技能文件、加载使用和优化更新四个阶段。系统提供技能检索和自维护机制(Curator),支持技能媒体路由和多种管理命令。内置技能涵盖开发调试、创意头脑风暴等场景,通过积累技能使Hermes更适应用户需求。

程序猿_三产 728

常用排序算法的java实现

/** * 冒泡排序 * 时间复杂度: 最小 = O(n), 最大 = O(n^2), 平均 = O(n^2) * * @param data 待排序序列 * @return */ public static int[] bubbleSort(int[] data) { if (data == null || data.length == 0 || data.length =...

LittleBeen 288

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

常用排序算法一览表

常用排序算法 类别 排序方法 时间复杂度 空间复杂度 稳定性 平均情况 最好情况 最坏情况 辅助存储 冒泡排序 直接...

墨、砚 257

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

常用八个排序算法性能总结

常用八个排序算法性能比较

菜鸟502的博客 429

常用排序算法的复杂度总结

常用排序算法的复杂度归纳:

汝南张公子的博客 362

Python常用的排序算法

常用的排序算法 拿li=[1,3,45,6,78,9,4]来举例 一.冒泡排序 空间复杂度O(n的2次方) 原理:例如你把一组数据从头开始依次遍历过去把最大的或者最小的放在末尾,除了最后一个每个依次进行遍历 def bubble_sort(li): for i in range(len(li)-1): flag = True for j in range(l...

转行程序员 217

常用排序算法思维导图

常用排序算法思维导图

解忧swag的博客 417

常用的排序算法

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

日暮南城故里的博客 2158

常用排序算法总结

 https://www.cnblogs.com/eniac12/p/5329396.html 目录 冒泡排序   鸡尾酒排序   选择排序 插入排序 二分插入排序   希尔排序   归并排序 堆排序 快速排序   我们通常所说的排序算法往往指的是内部排序算法,即数据记录在内存中进行排序。   排序算法大体可分为两种:     一种是比较排序,时间复杂度...

宁静致远 405

比较常用的排序算法总结

常用的排序 冒泡排序 选择排序 插入排序 桶排序 希尔排序 归并排序 快速排序 基数排序 堆排序 第一 冒泡排序 由于简单直接上代码 for(int i=1;i<=n;i++){ for(int j=i+1;j<=n;j++){ if(a[i]>a[j]) swap(a[i],a[j]);//当前的数大于后面的数,交换 } } 第二 选择排序 每次找到数组中最大或最小的数,将他与前面的数交换 for(int i=1;i<n;i++){ mina=-1;//更新

qq_44665427的博客 256

常用排序算法性能对比

排序算法常用排序算法性能对比冒泡排序 常用排序算法性能对比 冒泡排序

weixin_43250841的博客 111

8种常用的排序算法

8种常用的排序算法 数据结构中的排序是非常重要的知识,将数据排序是处理数据的基本起手操作。从类型上分排序可以分为内部排序和外部排序,对保存在内存中的数据进行排序成为内部排序,对保存在磁盘上的数据排序称为外部排序。 本文将对内部排序常用的8中排序做一个简单介绍,作为一个程序员,需要熟练掌握这8种常用的排序,理解其排序思想,并能以代码实现。 8种排序中的时间复杂度和空间复杂度一览 可以...

pan16309的博客 1590
下一篇: 井字棋游戏
陆标
博客等级 码龄9年 100粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值