自学内容网 自学内容网

常见查找排序算法

算法

作用: 提高代码运行效率

评判算法是否优良

时间复杂度

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

        代码执行时间越短越好

空间复杂度

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

常用算法

两数交换

方式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;
}


原文地址:https://blog.csdn.net/m0_75253775/article/details/143691597

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!