排序 -- 万能测试oj

news2024/11/22 21:43:31

. - 力扣(LeetCode)

 

这道题我们可以使用我们学过的那些常见的排序方法来进行解答 

//插入排序
void InsertSort(int* nums, int n)
{
    for (int i = 0; i < n-1; i++)
    {
        int end = i;
        int tmp = nums[end + 1];

        while (end >= 0)
        {
            if (tmp < nums[end])
            {
                nums[end + 1] = nums[end];
            }
            else
            {
                break;
            }
        }
        end--;
    }
}

//希尔
void ShellSort(int* nums, int numsSize) 
{
    int gap = numsSize;
    while(gap > 1)
    {
        gap = gap/2;
        for(int i =0; i < numsSize - gap; i++)
    {
        int end = i;
        int tmp = nums[end+gap];

        while(end >= 0)
        {
            if(tmp < nums[end])
            {
                nums[end + gap] = nums[end];
                end -= gap;
            }
            else
            {
                break;
            }
        }
        nums[end+gap] = tmp;
    }
    }
}

void Swap(int* a ,int* b)
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

//选择排序
void SelectSort(int* nums, int n)
{
    int left = 0;
    int right = n-1;

    while(left < right)
    {
        int maxi = left, mini = left;
        for(int i=left+1; i<=right; i++)
        {
            if(nums[i] > nums[maxi])
            {
                maxi = i;
            }

            if(nums[i] < nums[mini])
            {
                mini = i;
            }
        }

        Swap(&nums[left], &nums[mini]);
        if(maxi == left)
        {
            maxi = mini;
        }

        Swap(&nums[right], &nums[maxi]);

        ++left;
        --right;
    }
}


int GetMidi(int* nums, int left, int right)
{
    int midi = (left + right) / 2;
    if(nums[left] < nums[midi])
    {
        if(nums[midi] < nums[right])
        {
            return midi;
        }
        else if(nums[left] < nums[right])
        {
            return right;
        }
        else
        {
            return left;
        }
    }
    else
    {
       if(nums[midi] > nums[right])
       {
        return midi;
       }
       else if(nums[left] < nums[right])
       {
        return left; 
       }
       else
       {
        return right;
       }
    }
}

int PartSort(int* nums, int left, int right)
{
    int midi = GetMidi(nums, left, right);
    Swap(&nums[midi], &nums[left]);

    int keyi = left;
    while(left < right)
    {
        while(left < right && nums[right] >= nums[keyi])
        {
            right--;
        }

        while(left < right && nums[left] <= nums[keyi])
        {
            left++;
        }

        Swap(&nums[left],&nums[right]);
    }

    Swap(&nums[keyi],&nums[left]);
    return left;

    // int keyi = left;
    // int prev = keyi;
    // int cur = prev+1;

    // while(cur <= right)
    // {
    //     if(nums[cur] < nums[keyi] && ++prev != cur)
    //     {
    //         Swap(&nums[prev],&nums[cur]);
    //     }
    //     ++cur;
    // }
    // Swap(&nums[prev],&nums[keyi]);
    // return prev;
}


//快速排序
void QuickSort(int* nums, int begin, int end)
{
    if(begin >= end)
    {
        return;
    }

    // if((end - begin + 1) > 10)
    // {
    //     int keyi = PartSort(nums, begin, end);

    //     QuickSort(nums, begin, keyi-1);
    //     QuickSort(nums, keyi+1, end);
    // }
    // else
    // {
    //     InsertSort(nums + begin, end - begin + 1);
    // }

    int keyi = PartSort(nums, begin, end);

    QuickSort(nums, begin, keyi-1);
    QuickSort(nums, keyi+1, end);
}

void _MergeSort(int* nums, int* tmp, int begin, int end)
{
    if(end <= begin)
    {
        return;
    }

     int mid = (begin + end) / 2;

    _MergeSort(nums, tmp, begin, mid);
    _MergeSort(nums, tmp, mid+1, end);

    int begin1 = begin, end1 = mid;
    int begin2 = mid+1, end2 = end;

    int index = begin;
    while(begin1 <= end1 && begin2 <= end2)
    {
        if(nums[begin1] < nums[begin2])
        {
            tmp[index++] = nums[begin1++];
        }
        else
        {
            tmp[index++] = nums[begin2++];
        }
    }

    while(begin1 <= end1)
    {
        tmp[index++] = nums[begin1++];
    }

    while(begin2 <= end2)
    {
        tmp[index++] = nums[begin2++];
    }

    memcpy(nums+begin, tmp+begin, sizeof(int)*(end-begin+1));
}

//归并排序
void MergeSort(int* nums, int n)
{
    int* tmp = (int*)malloc(sizeof(int)*n);

    _MergeSort(nums, tmp, 0, n-1);
    free(tmp);

}

计数排序
void CountSort(int* nums, int n)
{
    int min = nums[0], max = nums[0];
    for(int i = 0; i<n;i++)
    {
        if(nums[i] < min)
        {
            min = nums[i];
        }

        if(nums[i] > max)
        {
            max = nums[i];
        }
    }

    int range = max - min + 1;
    int* tmp = (int*)malloc(sizeof(int)*range);
    memset(tmp, 0, sizeof(int)*range);

    for(int i =0;i<n;i++)
    {
        tmp[nums[i] - min]++; 
    }
    
    int j = 0;
    for(int i =0;i<range;i++)
    {
        while(tmp[i]--)
        {
            nums[j++] = i + min;
        }
    }
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1905062.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GuitarPro2024音乐软件#创作神器#音乐梦想

嘿&#xff0c;亲爱的朋友们&#xff01;&#x1f44b;&#x1f44b;&#x1f44b;今天我要给你们安利一款超赞的软件——Guitar Pro。这款软件简直是吉他手的福音啊&#xff01;&#x1f389;&#x1f389;&#x1f389; Guitar Pro免费绿色永久安装包下载&#xff1a;&#…

数据结构(其一)--基础知识篇

1. 数据结构三要素 1.1 数据结构的运算 即&#xff0c;增删改查 1.2 数据结构的存储结构 2. 数据类型&#xff0c;抽象数据类型 数据类型&#xff1a; &#xff08;1&#xff09;. 原子类型&#xff1a;bool、int... &#xff08;2&#xff09;. 结构类型&#xff1a;类、…

赤壁之战的烽火台 - 观察者模式

“当烽火连三月&#xff0c;家书抵万金&#xff1b;设计模式得其法&#xff0c;千军如一心。” 在波澜壮阔的三国历史长河中&#xff0c;赤壁之战无疑是一场改变乾坤的重要战役。而在这场战役中&#xff0c;一个看似简单却至关重要的系统发挥了巨大作用——烽火台。这个古老的…

LeetCode 算法:二叉树中的最大路径和 c++

原题链接&#x1f517;&#xff1a;二叉树中的最大路径和 难度&#xff1a;困难⭐️⭐️⭐️ 题目 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;…

赋值运算符重载和const成员函数和 const函数

文章目录 1.运算符重载(1)(2)运算符重载的语法&#xff1a;(3)运算符重载的注意事项&#xff1a;(4)前置和后置重载区别 2.const成员函数3.取地址及const取地址操作符重载4.总结 1.运算符重载 (1) 我们知道内置类型(整形&#xff0c;字符型&#xff0c;浮点型…)可以进行一系…

ImportError: DLL load failed while importing _imaging: 操作系统无法运行 %1

解决方案&#xff1a; &#xff08;1&#xff09;搜索打开Anaconda Prompt控制台&#xff0c;进入到自己要安装的环境下面去&#xff0c;卸载Pillow:pip uninstall Pillow 没有安装Pillow的就不用卸载&#xff0c;直接安装&#xff0c; &#xff08;2&#xff09;然后再安装&a…

入门PHP就来我这(高级)13 ~ 图书添加功能

有胆量你就来跟着路老师卷起来&#xff01; -- 纯干货&#xff0c;技术知识分享 路老师给大家分享PHP语言的知识了&#xff0c;旨在想让大家入门PHP&#xff0c;并深入了解PHP语言。 今天给大家接着上篇文章编写图书添加功能。 1 添加页面 创建add.html页面样式&#xff0c;废…

实验2 Aprori关联挖掘算法

目 录 一、实验目的... 1 二、实验环境... 1 三、实验内容... 1 3.1 connect_string()函数解析... 1 3.2 find_rule()函数解析纠错... 2 3.3 关联规则挖掘... 4 四、心得体会... 7 一、实验目的 &#xff08;1&#xff09;理解Aprori关联挖掘算法的程序编写&#xff1b; &…

《ClipCap》论文笔记(上)

原文出处 [2111.09734] ClipCap: CLIP Prefix for Image Captioning (arxiv.org) 原文笔记 What ClipCap&#xff1a; CLIP Prefix for Image Captioning 一言以蔽之&#xff1a;使用 CLIP 编码作为标题的前缀&#xff0c;使用简单的映射网络&#xff0c;然后微调语言模型…

EN-SLAM:Implicit Event-RGBD Neural SLAM解读

论文路径&#xff1a;https://arxiv.org/pdf/2311.11013.pdf 目录 1 论文背景 2 论文概述 2.1 神经辐射场&#xff08;NeRF&#xff09; 2.2 事件相机&#xff08;Event Camera&#xff09; 2.3 事件时间聚合优化策略&#xff08;ETA&#xff09; 2.4 可微分的CRF渲染技术…

Netty 启动源码阅读

文章目录 1. 入门2. Netty 代码实例3. Netty bind3.1 initAndRegister3.1.1 newChannel, 创建 NioServerSocketChannel3.1.2 init(channel); 初始化 NioServerSocketChannel3.1.3 register 注册channel 3.2 doBind0 绑定端口3.3 ServerBootstrapAcceptor 1. 入门 主从Reactor模…

不是哥们?你怎么抖成这样了?求你进来学学防抖吧!全方位深入剖析防抖的奥秘

前言 古有猴哥三打白骨精&#xff0c;白骨精 > 噶 今有用户疯狂点请求&#xff0c;服务器 > 噶 所以这防抖咱必须得学会&#xff01;&#xff01;&#xff01; 本文就来讲解一下Web前端中防抖的奥秘吧&#xff01;&#xff01;&#xff01;&#xff01; 为什么要做防…

2-27 基于matlab的一种混凝土骨料三维随机投放模型

基于matlab的一种混凝土骨料三维随机投放模型&#xff0c;为混凝土细观力学研究提供一种快捷的三维建模源代码。可设置骨料数量&#xff0c;边界距离、骨料大小等参数。程序已调通&#xff0c;可直接运行。 2-27 matlab 混凝土骨料三维随机投放模型 - 小红书 (xiaohongshu.com)…

盘点8款国内顶尖局域网监控软件(2024年国产局域网监控软件排名)

局域网监控软件对于企业网络管理至关重要&#xff0c;它们可以帮助IT部门维护网络安全&#xff0c;优化网络性能&#xff0c;同时监控和控制内部员工的网络使用行为。以下是八款备受推崇的局域网监控软件&#xff0c;每一款都有其独特的优势和适用场景。 1.安企神软件 试用版领…

CompletionService

必备知识&#xff1a; 三种创建线程的方式 java线程池 CompletionService是Java并发库中的一个接口&#xff0c;用于简化处理一组异步任务的执行和结果收集。它结合了Executor和BlockingQueue的功能&#xff0c;帮助管理任务的提交和完成。CompletionService的主要实现类是Exe…

python破解字母已知但大小写未知密码

python穷举已知字符串中某个或多个字符为大写的所有情况 可以使用递归函数来实现这个功能。以下是一个示例代码&#xff1a; def generate_uppercase_combinations(s, index0, current):if index len(s):print(current)returngenerate_uppercase_combinations(s, index 1, …

如何保证接口幂等性

如何保证接口幂等性 1、幂等性是什么&#xff1f; 接口幂等性是指用户对于同一操作发起的一次请求或者多次请求的结果是一致的&#xff0c;不会因为多次点击而产生了不同的结果。 2、使用幂等性的场景有哪些&#xff1f; 页面点击保存按钮时&#xff0c;不小心快速点了两次…

BUUCTF[PWN][fastbin attack]

fastbin_attack例题 题目&#xff1a;[BUUCTF在线评测 (buuoj.cn)](https://buuoj.cn/challenges#[ZJCTF 2019]EasyHeap) 整体思路&#xff1a;利用编辑时edit_heap函数的栈溢出漏洞&#xff0c;覆盖heaparray中的栈指针指向free的got表&#xff0c;将其改为system的plt表&…

Bert入门-使用BERT(transformers库)对推特灾难文本二分类

Kaggle入门竞赛-对推特灾难文本二分类 这个是二月份学习的&#xff0c;最近整理资料所以上传到博客备份一下 数据在这里&#xff1a;https://www.kaggle.com/competitions/nlp-getting-started/data github&#xff08;jupyter notebook&#xff09;&#xff1a;https://gith…

C语言指针函数指针

跟着这篇文章重新理解了一下&#xff1a;彻底攻克C语言指针 有一个例子感觉可以拿出来看看&#xff1a; char *(*c[10])(int **p); * 这段声明定义了一个长度为10的数组c&#xff0c;数组中的每个元素都是指向函数的指针。每个函数接受一个类型为int **&#xff08;指向指向…