【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;
    }
}
相关推荐
一起养小猫2 小时前
Flutter for OpenHarmony 进阶:推箱子游戏算法与关卡设计深度解析
算法·flutter·游戏
民乐团扒谱机2 小时前
【微实验】Zhang-Suen 快速并行细化算法与MATLAB实现
人工智能·学习·算法·计算机视觉·数学建模·matlab
iAkuya2 小时前
(leetcode)力扣100 60单词搜索(回溯)
算法·leetcode·职场和发展
卖报的大地主2 小时前
强化学习在图像生成中的应用:范式演进、算法机制与前沿展望
算法
闲人不梦卿2 小时前
数据结构之查找的方法
数据结构
ʚB҉L҉A҉C҉K҉.҉基҉德҉^҉大2 小时前
C++中的策略模式进阶
开发语言·c++·算法
fengxin_rou2 小时前
Redis 核心数据结构:跳表实现、层高设计解析
数据结构·数据库·redis
穿过锁扣的风2 小时前
决策树:从入门到实战,解锁 AI 分类预测的核心利器
数据结构·python·决策树
weixin_445402302 小时前
模板元编程应用场景
开发语言·c++·算法