【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;
    }
}
相关推荐
周末也要写八哥17 小时前
浅谈二叉树的深度优先搜索(DFS)算法
算法·深度优先
y = xⁿ17 小时前
20天速通LeetCodeday17:一维动态规划
算法
bnmoel17 小时前
数据结构深度剖析栈与队列:结构、边界实现与进出操作全解析
c语言·数据结构·算法··队列
WL_Aurora17 小时前
Python 算法基础篇之查找算法(一):顺序查找、二分查找与插值查找
开发语言·python·算法
ChoSeitaku18 小时前
06_可变参数_递归_类和对象_封装
java·数据结构·算法
-To be number.wan18 小时前
算法日记 | 动态规划(初级)
算法·动态规划
_深海凉_18 小时前
LeetCode热题100-二叉搜索树中第 K 小的元素
算法·leetcode·职场和发展
图码18 小时前
文本两端对齐算法详解:从LeetCode到实际应用
数据结构·图像处理·算法·leetcode·生成对抗网络·面试·职场和发展
liu****18 小时前
第16届国赛蓝桥杯大赛C/C++大学C组
c语言·数据结构·c++·算法·蓝桥杯
沈浩(种子思维作者)18 小时前
物理的本质是数学,还是数学只是描述物理的方便之语?
人工智能·python·算法