细数排序(1)

简介: 细数排序(1)

插入排序

void insertsort(int *arr, int n)
{
  int i;
  for (i = 0; i < n - 1; i++)
  {
    int end = i;
    int tmp = arr[end + 1];
    while (end >= 0)
    {
      if (tmp < arr[end])
      {
        arr[end + 1] = arr[end];
        end--;
      }
      else
      {
        break;
      }
        }
    arr[end+1] = tmp;//因为走到了要求的数的前一个位置,那么他的后一位就是我们要插入的位置
  }
}

希尔排序

// 时间复杂度是O(N*logN);
void shellsort(int *arr,int n)
{
  //为了应对假如说使用插入排序的时候,那个数过于无序,如我们对一个逆序的数组,将他排序成顺序的,
  //一个一个的排时间复杂度过于大,太浪费了
  //所以我们可以使用中间间隔多的为一组进行排序,尽量把大的数字放到后面去,小的数字放到前面去,做到尽量有序
  //当间隔为1的时候就是直接插入排序
  int gap = n;
  int i;
  while (gap > 1)
  {
    gap = gap / 2;//如果gap是%2的话,最后gap会变成1,就是直接插入排序
      //假如我们是gap=gap/3的话,最后可能就不能变成1变成直接插入排序了,希尔排序内部的算法可以类比,直接插入排序,只不过把原来的1变成了gap
    for (i = 0; i < n - gap; i++)
    {
      int end = i;
      int tmp = arr[end + gap];
      while (end >= 0)
      {
        if (tmp < arr[end])
        {
          arr[end + gap] = arr[end];
          end -= gap;
        }
        else
        {
          break;
        }
      }
      arr[end + gap] = tmp;
    }
  }
}

选择排序

void selectsort(int *arr, int n)
{
  int begin = 0, end = n - 1;//
  while (begin < end)//begin和end分别从两边开始走,begin一方找到的是最小的那些数,end一方找到的是最大的一些数,当两者相遇或者刚好走到挨着的时候,就排序完成了
  {
    int max=begin, min=begin;
    for (int i = begin; i <= end; i++)
    {
      if (arr[i] < arr[begin])
      {
        min = i;//把最小的下标存到min里面
      }
      if (arr[i] > arr[begin])
      {
        max = i;//把最大的下标存到max里面
      }
    }
    swap(&arr[begin], &arr[min]);//处理完后把找到的最小下标和begin进行交换
//假如说第一个就是最大的,那交换之后,最大的就和最小的交换了
if(begin==maxi)
{
maxi=mini;
}
    swap(&arr[end], &arr[max]);//把最大下标和end进行交换
    begin++;
    end--;
  }
}

快速排序

void quicksort(int *arr, int left,int right)
{
  if (left >= right)//当left>right就算是不存在,=就是只有一个值,都是不用排
  {
    return;
  }
  int begin = left, end = right;
  int pivot = begin;//把左边做一个坑
  int key = arr[begin];//把左边的数作为关键字,保存起来
  //一趟的排序
  while (begin < end)//左边做坑则右边先动
  {
    //右边找小,放到左边
    while (begin < end&&arr[end] >= key)//大于就--,小于才停下来//同时end走的必须是在begin右边,因为begin左边都是以及处理过的,所以end要大于begin
    {
      --end;
    }
    //找到的小的,放到左边,从而自己形成了新的坑位
    arr[pivot] = arr[end];
    pivot = end;
    //现在去找大
    while (begin<end &&arr[begin] <= key)//始终保证begin<end的条件
    {
      ++begin;
    }
    //大的放到左边的坑,自己形成新的坑位
    arr[pivot] = arr[begin];
    pivot = begin;
  }
  pivot = begin;//到达了中间的位置
  arr[pivot] = key;
  //[在left,right]
  //每次调用这函数都被分成3部分
  //[left,pivot-1],pivot,[pivot+1,right]//始终被分成了这三个部分,pivot是已经有序的了
  //只要让左子区间和右子区间有序,我们就有序了,我们就用到了分治递归的思想
  quicksort(arr, left, pivot - 1);
  quicksort(arr, pivot + 1, right);
}
相关文章
|
前端开发 API 决策智能
多智能体微调实践:α-UMi 开源
近年来,为了加强大型语言模型(Large-Language Models, LLM)实时信息处理、解决专业问题的能力,催生了工具调用智能体(Tool Integrated Agent)概念
|
编解码 监控
Zoom + OBS + B 站直播配置
Zoom + OBS + B 站直播配置
|
9月前
|
NoSQL 数据库 Redis
如何保证MQ幂等性?或 如何防止消息重复消费?
如何保证MQ幂等性?或 如何防止消息重复消费?
|
Python
Python-循环
Python-循环
85 1
|
数据采集 存储 自然语言处理
基于Qwen2.5的大规模ESG数据解析与趋势分析多Agent系统设计
2022年中国上市企业ESG报告数据集,涵盖制造、能源、金融、科技等行业,通过Qwen2.5大模型实现报告自动收集、解析、清洗及可视化生成,支持单/多Agent场景,大幅提升ESG数据分析效率与自动化水平。
821 0
|
Ubuntu 开发工具 git
Ubuntu安装homebrew的完整教程
本文介绍了如何在没有公网的情况下安装 Homebrew。首先访问 Homebrew 官网,然后通过阿里云的镜像克隆安装脚本,并创建普通用户进行安装。接着修改 `install.sh` 文件指向国内镜像,执行安装命令。最后配置环境变量并更换 Homebrew 源为国内镜像,确保安装顺利。
2462 50
Flutter-自定义图片3D画廊
Flutter-自定义图片3D画廊
239 0
|
UED
返回按钮——没有上一页的URL时,跳转到首页(document.referrer的妙用)
返回按钮——没有上一页的URL时,跳转到首页(document.referrer的妙用)
306 0
|
机器人 计算机视觉
首次机器人抓取云竞赛引国际学界广泛关注和参与
近日,阿里巴巴达摩院人工智能实验室与University of South Florida等国外著名研究机构共同举办了世界首次机器人抓取云竞赛:OCRTOC竞赛。OCRTOC竞赛聚焦于机器人抓取能力以及桌面物品整理的应用场景,旨在成为机器人抓取技术领域的ImageNet。OCRTOC竞赛获得了国际电气电子工程师协会两大技术委员会的大力支持,并成为国际机器人顶会IROS2020的正式官方赛事,吸引了全球顶尖学府的关注!
482 0
首次机器人抓取云竞赛引国际学界广泛关注和参与
|
缓存 小程序 测试技术
建议收藏!初级软件测试面试题及题库答案,你肯定用得上
软件测试的面试过程中,面试官往往都会根据你面试的职位,提问一些相关的软件测试知识,而很多人为了能够提高的自己在面试当中的通过率,都会在面试前做好充足的准备。
804 0