【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;
    }
}
相关推荐
Lyyaoo.16 分钟前
【数据结构】HashMap底层存储+扩容机制+线程安全【待更新】
数据结构·安全·哈希算法
如何原谅奋力过但无声18 分钟前
【灵神高频面试题合集09-13】二叉树、二叉搜索树
数据结构·算法·leetcode
皆圥忈23 分钟前
磁盘物理结构与文件系统基础讲解
linux·算法
数据仓库搬砖人28 分钟前
用 LangGraph 从零搭一个客服 Agent:多轮对话 + 工具调用全流程
算法
GuWenyue28 分钟前
告别JS类型坑!Ts为什么在ai时代逐渐成为"第一"语言
前端·算法·typescript
子琦啊29 分钟前
哈希与前缀和
算法·哈希算法
xqqxqxxq30 分钟前
树结构技术学习笔记
数据结构·笔记·学习
Deep-w38 分钟前
【MATLAB】基于离散 LQR 的车辆横向轨迹跟踪控制方法研究
开发语言·算法·matlab
Peter·Pan爱编程44 分钟前
23. 算法库:用算法代替手写循环
c++·人工智能·算法
小欣加油1 小时前
leetcode2161 根据给定数字划分数组
数据结构·c++·算法·leetcode·职场和发展