常见查找排序算法

devtools/2024/11/16 15:24:02/

算法

作用: 提高代码运行效率

评判算法是否优良

时间复杂度

        预测代码执行所需的时间与关键系数的关系

        代码执行时间越短越好

空间复杂度

        代码执行所需占用的空间,越小越好

常用算法

两数交换

方式1:

        int a=10;

        int b=1;

        int c = a;
        a = b;
        b = c;

方式2:

        int a=10;

        int b=1;

        a=a+b;

        b=a-b;

        a=a-b;

方式3:

        int a=10;        

        int b=1;

        a=a^b;

        b=a^b;

        a=a^b;

查找最值

步骤:

        1,假定容器中的某个值为最大值或最小值

        2,遍历该容器

        3,使用遍历获取的值与假设的最大值或最小值比较

        4,如果变量的值大于最大值或遍历的值小于最小值,那么将遍历获取的值赋值给假设的变

        5,当遍历完成后假设的最值就是真的最值
如:
        int nums[]={21,56,23,44,76,89,12,0,35,65,78};
        int max=nums[0];
        for(int i=0;i<sizeof(nums)/sizeof(nums[0]);i++)
        {
                if(max<nums[i])
                {
                        max=nums[i];
                }
        }
        printf(("max = %d\n",max);

查找最值下标

步骤:

        1,假定容器中的某个下标对应的值为最大值/最小值

        2,遍历该容器
        3,使用遍历获取的值与假设的最大值 / 最小值下标对应的值进行比较
        4,如果假设的最值下标对应的值小于遍历获取的值 ( 最大值下标 ) 或大于遍历获取的值(最小值下标 )
        5,将最值下标修改
        6,当遍历完成后 , 假设的最值下标就是真的最值下标
如:
        int nums[] = {21,56,23,44,76,89,12,0,35,65,78};
        int minIndex=0;
        for(int i = 0; i < sizeof(nums)/sizeof(nums[0]); i++)
        {
                if(nums[minIndex] > nums[i])
                {
                        minIndex = i;
                }
        }
        printf("minIndex = %d\n",minIndex);

冒排排序

思想:相邻比较

如:

        int nums[] = {21,56,23,44,76,89,12,0,35,65,78};

        int len=sizeof(nums)/sizeof(nums[0]);

        for(int j=0;j<len;j++)

        {

                for(int i=0;i<len-1;i++)

                {

                        if(nums[i]<nums[i+1])

                        {       

                                int x = nums[i];
                                nums[i] = nums[i+1];
                                nums[i+1] = x;

                        }

                }

        }

选择排序

思想:逐个比较

如:
        int nums[] = {21,56,23,44,76,89,12,0,35,65,78};
        int len = sizeof(nums) / sizeof(nums[0]);
        for(int j = 0; j < len; j++)
        {
for(int i = j; i < len; i++)
{
if(nums[j]>num[i])
{                               
                                int x = nums[j];
                                nums[j] = nums[i];
                                nums[i] = x;
}
}
        }

顺序查找

思想:逐个查找

如:

#include <stdio.h>

int main() {
    int arr[] = { 12, 25, 37, 41, 53, 62, 78, 84, 91 };
    int n = sizeof(arr) / sizeof(arr[0]);
    int key = 53;
    int i;

    for (i = 0; i < n; i++) {
        if (arr[i] == key) {
            break;
        }
    }

    if (i < n) {
        printf("元素 %d 在数组中的下标是 %d\n", key, i);
    } else {
        printf("未找到元素 %d\n", key);
    }

    return 0;
}

二分查找

思想:折半法

注意:数组必须是从小到大或从大到小是有序的

如:

#include <stdio.h>

int main() {
    int arr[] = {10, 20, 30, 40, 50, 60, 70, 80, 90};
    int n = sizeof(arr) / sizeof(arr[0]);
    int key = 50;

    int left = 0;
    int right = n - 1;
    int mid;
    int found = 0;

    while (left <= right &&!found) {
        mid = left + (right - left) / 2;

        if (arr[mid] == key) {
            found = 1;
        } else if (arr[mid] < key) {
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }

    if (found) {
        printf("元素 %d 在数组中的下标是 %d\n", key, mid);
    } else {
        printf("未找到元素 %d\n", key);
    }

    return 0;
}


http://www.ppmy.cn/devtools/134464.html

相关文章

操作系统实验:在linux下用c语言模拟进程调度算法程序

文章目录 1、实验内容2、实验结果及分析3、如何在linux下编写并执行c语言程序以及实验源代码gcc -o test test.c1、实验内容 1)用C语言编程实现对N个进程采用某种进程调度算法(如动态优先权调度算法、先来先服务算法、短进程优先算法、时间片轮转调度算法)调度执行的模拟。…

为什么 Vue3 封装 Table 组件丢失 expose 方法呢?

在实际开发中&#xff0c;我们通常会将某些常见组件进行二次封装&#xff0c;以便更好地实现特定的业务需求。然而&#xff0c;在封装 Table 组件时&#xff0c;遇到一个问题&#xff1a;Table 内部暴露的方法&#xff0c;在封装之后的组件获取不到。 代码展示为&#xff1a; …

坚果云·无法连接服务器(无法同步)

cmd&#xff0c;右键选择&#xff1a;以管理员身份打开输出netsh winsock reset&#xff0c;重启计算机即可 &#xff08;这是由于某些代理防火墙导致的&#xff1b;关闭代理&#xff0c;使用代理设置清理器&#xff09; 如果还不行&#xff0c; 换用移动热点、关闭有线网络&a…

鸿蒙动画开发06——打断动画

1、前 言 UI界面除了运行动画之外&#xff0c;还承载着与用户进行实时交互的功能。当用户行为根据意图变化发生改变时&#xff0c;UI界面应做到即时响应。 例如用户在应用启动过程中&#xff0c;上滑退出&#xff0c;那么启动动画应该立即过渡到退出动画&#xff0c;而不应该…

视频流媒体播放器EasyPlayer.js RTSP播放器视频颜色变灰色/渲染发绿的原因分析

EasyPlayer.js RTSP播放器属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#xff0c;无须安装任何插件&#xff0c;起播快、延迟低、兼容性强&#xff0c;使用非常便捷。 EasyPlayer.js播放器不仅支持H.264与H.265视频编码格式&#xff0…

芯原科技嵌入式面试题及参考答案

Linux 相关驱动怎么写? 在 Linux 中编写驱动主要有以下步骤。 首先,需要了解设备的硬件特性。这包括设备的工作原理、寄存器地址和功能、中断号等信息。例如,对于一个简单的 GPIO 设备,要知道其数据寄存器、方向寄存器的位置以及读写操作的规则。 然后是模块的初始化部分。…

【全面系统性介绍】虚拟机VM中CentOS 7 安装和网络配置指南

一、CentOS 7下载源 华为源&#xff1a;https://mirrors.huaweicloud.com/centos/7/isos/x86_64/ 阿里云源&#xff1a;centos-vault-7.9.2009-isos-x86_64安装包下载_开源镜像站-阿里云 百度网盘源&#xff1a;https://pan.baidu.com/s/1MjFPWS2P2pIRMLA2ioDlVg?pwdfudi &…

Kotlin约束泛型参数必须继承自某个父类

Kotlin约束泛型参数必须继承自某个父类 open class SuperData { }class DataA : SuperData {constructor() {println("DataA constructor")} }class DataB : SuperData {constructor() {println("DataB constructor")} }fun <T : SuperData> myfun(p…