首页 > 编程语言 >77.《排序算法实现》

77.《排序算法实现》

时间:2024-12-21 09:34:57浏览次数:4  
标签:high dk int ElemType void 77 算法 low 排序

插入排序:

直接插入排序:
void InsertSort(ElemType A[], int n)
{
    int i, j;
    for (int i = 2; i <= n; i++) // 从第二个元素开始遍历数组
        if (A[i] < A[i - 1]) // 如果当前元素小于前一个元素
        {
            A[0] = A[i]; // 将当前元素暂存到A[0]
            for (j = i - 1; A[0] < A[j]; j--) // 从后往前遍历已排序部分
                A[j + 1] = A[j]; // 将大于当前元素的值向后移动
            A[j + 1] = A[0]; // 插入当前元素到正确位置
        }
}

折半插入排序:
void InsertSort(ElemType A[], int n)
{
    int i, j, low, high, mid;
    for (int i = 2; i <= n; i++)
        A[0] = A[i];
    low = 1;
    high = i - 1;
    while (low <= high)
    {
        mid = (low + high) / 2;
        if (A[mid] > A[0])
            high = mid - 1;
        else
            low = mid + 1;
    }
    for (j = i - 1; j >= high + 1; j--)
        A[j + 1] = A[j];
    A[high + 1] = A[0];
}

希尔排序:
void ShellSort(ElemType A[], int n)
{
    int dk, i, j;
    for (dk = n / 2; dk >= 1; dk = dk / 2)
        for (int i = dk + 1; i <= n; i++)
            if (A[i] < A[i - dk])
            {
                A[0] = A[i];
                for (j = i - dk; j > 0 && A[0] < A[j]; j -= dk)
                    A[j + dk] = A[j];
                A[j + dk] = A[0];
            }
}

交换排序:

冒泡排序:
void sort(ElemType arr[],int n){
    //外层循环
    for (int i = 0; i < n-1; ++i) {
        int flag=1;  //假设flag=1 就是已经排序好的
        //内层循环
        for (int j = 0; j < n-1-i; ++j) {
            //判断升序 赋值
			//如果是降序的话 把> 改成<即可
            if(arr[j]>arr[j+1]){
                int tem=arr[j];
                arr[j]=arr[j+1];
                arr[j+1]=tem;
                //如果进行了元素交换 就说明没有排序好
                flag=0;
            }
        }
        if(flag==1){
            break;
        }
    }
}

快速排序:
//划分算法
int Partition(ElemType A[], int low, int high)
{
    ElemType pivot = A[low];
    while (low < high)
    {
        while (low < high && A[high] >= pivot)
            --high;
        A[low] = A[high];
        while (low < high && A[low] <= pivot)
            ++low;
        A[high] = A[low];
    }
    A[low] = pivot;
    return low;
}
//对枢轴两个表划分 然后递归调用快速排序算法排序
void QuickSort(ElemType A[],int low,int high){
    if(low<high){
        int pivot_pos=Partition(A,low,high);
        QuickSort(A,low,pivot_pos-1);
        QuickSort(A,pivot_pos+1,high);
    }
}

选择排序:

简单选择排序:
void SelectSort(ElemType A[], int n)
{
    for (int i = 0; i < n - 1; i++)
    {
        int min = i;
        for (int j = i + 1; j < n; j++)
            if (A[j] < A[min])
                min = j;
        if (min != i)
            swap(A[i], A[min]);
    }
}

堆排序(大根堆):
// 建堆
void BuildMaxHeap(ElemType A[], int len)
{
    for (int i = len / 2; i > 0; i--)
        HeadAdjust(A, i, len);
}
// 调整
void HeadAdjust(ElemType A[], int k, int len)
{
    A[0] = A[k];
    for (int i = 2 * k; i <= len; i *= 2)
    {
        if (i < len && A[i] < A[i + 1])
            i++;
        if (A[0] >= A[i])
            break;
        else
        {
            A[k] = A[i];
            k = i;
        }
    }
    A[k] = A[0];
}
void HeapSort(ElemType A[], int len)
{
    BuildMaxHeap(A, len);
    for (int i = len; i > 1; i--)
    {
        swap(A[i], A[1]);
        HeadAdjust(A, 1, i - 1);
    }
}

归并排序:

归并排序:
void Merge(ElemType A[], int low, int mid, int high)
{
    int i, j, k;
    for (k = low; k <= high; k++)
        B[k] = A[k];
    for (i = low, j = mid + 1, k = i; i <= mid && j <= high; k++)
    {
        if (B[i] <= B[j])
            A[k] = B[i++];
        else
            A[k] = B[j++];
    }
    while (i <= mid)
        A[k++] = B[i++];
    while (i <= high)
        A[k++] = B[j++];
}
void MergeSort(ElemType A[], int low, int high)
{
    if (low < high)
        int mid = (low + high) / 2;
    MergeSort(A, low, mid);
    MergeSort(A, mid + 1, high);
    Merge(A, low, mid, high);
}

标签:high,dk,int,ElemType,void,77,算法,low,排序
From: https://www.cnblogs.com/gaodiyuanjin/p/18620325

相关文章

  • 声音提取引擎算法
    声音提取引擎算法是一种用于从音频信号中提取有用信息的技术,广泛应用于语音识别、音频分析和声音处理等领域。我们可以总结出几种主要的声音提取算法及其应用。MFCC是最常用的语音特征提取方法之一,它通过傅里叶变换和滤波器组处理来捕捉语音信号的频率和振幅特征。MFCC的计算......
  • 按排序规律插入数据
    Description 对一组已经排好序的数组,要求输入m个数,将这m个数按照原来的排序规律插入数组中。输出得到的新数组。Input 第一行输入一个n,代表已经排好序的元素个数,n不大于20。第二行,输入n个已经排好序的整数。第三行输入一个m,代表要插入的元素个数。第四行输入m个整数,代......
  • 【算法】【优选算法】模拟
    目录一、模拟简介二、1576.替换所有的问号三、495.提莫攻击四、6.N字形变换五、38.外观数列六、1419.数⻘蛙一、模拟简介模拟就是依葫芦画瓢,题目会将如何做给出来,直接做出来就行。做题过程:先模拟算法流程,再将流程转化为代码。二、1576.替换所有的问号题目链接:1......
  • CF1477D Nezzar and Hidden Permutations 题解
    Description给定一张\(n\)个点\(m\)条边的简单无向图,构造两个排列\(p,q\),使得:对任意\((u,v)\inE\),\((p_u-p_v)(q_u-q_v)>0\).在此基础上,最大化\(\left|\left\{i\|\p_i\neqq_i\right\}\right|\).\(1\leqn,m\leq5\times10^5\)。Solution首先显然如果存在一个......
  • 用C#实现感知器算法——从零开始打造一个简单的机器学习模型!
    感知器(Perceptron)是一个经典的机器学习算法,常用于二分类问题。它是神经网络的基础,最早由FrankRosenblatt在1958年提出。今天,我们将用C#实现一个简单的感知器算法,让你理解感知器的工作原理,并能够亲自编码一个可用的模型。一、感知器算法概述感知器是一种线性分类器,其核心思想是......
  • 使用Python实现两组数据纵向排序
    使用Python实现两组数据纵向排序 本文详细介绍了如何使用Python实现两组数据的纵向排序,包括开发思想、开发流程和代码示例。通过本文的学习,读者可以掌握如何使用Python的内置函数和第三方库进行排序操作,并能够处理各种边界情况。本文提供的代码示例具有实际应用价值,可以用于......
  • C语言 排序
    时间:2024.12.18一、冒泡排序(BubbleSort)原理比较相邻的元素。如果第一个比第二个大,就交换它们两个。对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的......
  • 最优雅的算法——快速排序
    快速排序:探索两种流行的方法快速排序,这个听起来有点技术性的术语,实际上是一个既高效又优雅的算法,它能够将一堆混乱的数据快速整理得井井有条。今天,我们将通过一种轻松愉快的方式,一起揭开快速排序的神秘面纱,并探索两种流行的实现方法。话不多说,开始战斗快速排序的魔法:基......
  • 【字符串匹配算法——BF算法】
    ......
  • 机器学习之聚类(k均值聚类、层次聚类、密度聚类、EM算法、高斯混合模型)思维导图
    学习笔记—机器学习-聚类(k均值聚类、层次聚类、密度聚类、EM算法、高斯混合模型)思维导图20241220,以后复习看。(西瓜书+统计学习方法)学的迷糊的,如果错别字,请忽略。PS:图片看不清,可以下载下来看。往期思维导图:机器学习之集成学习Bagging(随机深林、VR-树、极端随机树)思维导......