【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;
    }
}
相关推荐
微尘hjx7 小时前
【ByteTrack 04】多轨迹算法ByteTrack改进点
算法·yolo·目标检测·目标跟踪·bytetrack·ultralytics·车跟踪
路灯上の马陈8 小时前
二叉树的定义与性质
数据结构·二叉树·树结构·1024程序员节
小蒋观天下11 小时前
雷击与浪涌防护:前端SPD选型、接地网误区,接地不当反而引入干扰
深度学习·算法·机器学习
Bshaya_12 小时前
红黑树详解:概念、规则与插入实现
数据结构·红黑树·二叉搜索树·平衡树·插入逻辑
WBluuue12 小时前
数据结构与算法:分块(一):块状数组、块状链表
数据结构·c++·算法·链表
路灯上の马陈13 小时前
数据结构-树
数据结构·1024程序员节
澳鹏Appen14 小时前
澳鹏重磅发布ExamOCRBench:面向端到端试卷判分的多任务基准
算法·benchmark·基准评测
benjormin14 小时前
Java数据结构 二叉搜索树
数据结构·算法
人工智能培训14 小时前
知识图谱:结构化表达实体与关系的知识组织技术
大数据·人工智能·算法·重构·生活·知识图谱