【DAY20】数据结构基础:(算法)排序、折半查找的函数实现

一、排序

|------|-----------------------------|----------|
| 名称 | 稳定性(值相同的两个数据在进行排序后,位置是否会改变) | 时间复杂度 |
| 冒泡排序 | 稳定 | O(n^2) |
| 选择排序 | 不稳定 | O(n^2) |
| 插入排序 | 稳定 | O(n^2) |
| 快速排序 | 不稳定 | O(nlogn) |
| 希尔排序 | 不稳定 | O(nlogn) |

1.时间复杂度为O(n^2) 的排序

先生成随机数,写输入输出函数

cpp 复制代码
#include<time.h>
#include<stdio.h>
#include<stdlib.h>

int Input(int *pArray, int len)
{
    int i = 0;
    srand(time(NULL));    //生成随机数
    for(i = 0; i < len; i++)
    {
        pArray[i] = rand() % (len * 100);
        //取随机数
    }
    
    return 0;
}

int OutputArray(int *pArray, int len)
{
    int i = 0;
    for(i = 0; i < len; i++)
    {
        printf("%d ", pArray[i]);
    }
    printf("\n");
}

1.冒泡排序

cpp 复制代码
int Bullesotr(int *pArray, int len)
{
    int i = 0;
    int j = 0;
    int tmp = 0;

    for(j = 0; j < len-1; j++)
    {
        for(i = 0; i < len-1-j; i++)
        {
            if(pArray[i] > pArray[i+1])
            {
                tmp = pArray[i];
                pArray[i] = pArray[i+1];
                pArray[i+1] = tmp;
            }
        }
    }
    return 0;

}

2.选择排序

cpp 复制代码
int SelectSort(int *pArray, int len)
{
    int i = 0;
    int j = 0;
    int min = 0;
    int tmp = 0;

    for(j = 0; j < len - 1; j++)
    {
        for(i = 1; i < len; i++)
        {
            if(pArray[i] < pArr[min])
            {
                min = i;
            }
            if(min != j)
            {
                tmp = pArray[j];
                pArray[i] = pArray[min];
                pArray[min] = tmp;
            }
        }
    }

    return 0;
}

3.插入排序

cpp 复制代码
int InsertSort(int *pArray, int len)
{
    int i = 0;
    int j = 0;
    int tmp = 0;

    for(j = 1; j <len; j++)
    {
        tmp = pArray[j];
        for(i = 1; i>0 && pArray[i-1] > tmp; i--)
        {
            pArray[i] = pArray[i-1];
        }
        pArray[i] = tmp;
    }
    return 0;
}

2.时间复杂度为O(nlogn)的排序

1.希尔排序

cpp 复制代码
int ShellSort(int *pArray, int len)
{
    int i = 0;
    int j = 0;
    int step = 0; //步长
    int tmp = 0;

    for(step = len /2; step >0; step /=2)
    {
        for(j = step; j < len; j++)
        {
            tmp = pArray[j];
            for(i = j; i > step-1 && pArray[i- step] > tmp; i-=step)
            {
                pArray[i] = pArray[i -step];
            }
            pArray[i] = tmp;
        }
    }
    return 0;
}

2.快速排序

cpp 复制代码
int QuickSort(int *pArray, int low, int high)
{
    int i = 0;
    int j = 0;
    int key = 0;

    key = pArray[low];//键值
    j = high;
    i = low;

    while(i<j)
    {
        while(i<j && pArray[j] >= key)
        {
            j--;
        }
        pArray[i] = pArray[j];

        while(i<j && pArray[i] <= key)
        {
            i++;
        }
        pArray[j] = pArray[i];
    }
    pArray[i] = key;

    if(low < i-1)
    {
        QuickSort(pArray ,low, i-1);
    }

    if(i+1 < high)
    {
        QuickSort(pArray, i+1, high);
    }

    return 0;
}

二、折半查找

前提:数据排列必须有序

cpp 复制代码
int MidSerch(int *pArray, int low, int high, int tmp)
{
    int Mid = 0;

    if(high < low)
    {
        return -1;
    }

    Mid = (low + high) / 2;
    if(pArray[Mid] > tmp)
    {
        return MidSerch(pArray, low, Mid-1, tmp);
    }
    else if(pArray[Mid] < tmp)
    {
        return MidSertch(pArray, Mid+1, high, tmp);
    }
    else if(pArray[Mid] == tmp)
    {
    return Mid;
    }
}
相关推荐
yi0115 小时前
LeetCode 219:存在重复元素 II——哈希表记录“最近一次出现的位置”
数据结构·人工智能·笔记·python·算法·leetcode·哈希表
灯澜忆梦8 小时前
【面向对象编程C++】| 基础语法
java·c++·算法
禾小西8 小时前
Redis 数据结构:快速的 Redis 有哪些慢操作?
数据结构·数据库·redis
小蒋观天下8 小时前
专项方案:大场景港口AI安防、多干扰环境下的算法调优与落地实操
人工智能·深度学习·算法·安全·机器学习·计算机视觉·ai大模型
Evand J8 小时前
【电机滤波例程5】渐消因子自适应扩展卡尔曼滤波(EKF),MATLAB。PMSM负载突变下的状态估计。附下载链接
算法·matlab
H.莓飛8 小时前
【数据结构】二叉树_OJ题
linux·开发语言·数据结构·算法
好想像大佬一样能够ak所有9 小时前
Leetcode35.搜索插入位置
数据结构·算法·leetcode
aqiu1111119 小时前
【C++算法打怪专栏】LeetCode 165. 比较版本号(双指针与字符串流法)
c++·算法·leetcode
黄金龙PLUS9 小时前
如何基于置换算法来设计对称加密算法
算法·网络安全·密码学·哈希算法·同态加密
不会就选b9 小时前
算法日常・每日刷题--<动态规划>14
算法