首页 > 编程语言 >常考的排序算法

常考的排序算法

时间:2024-11-07 10:48:20浏览次数:3  
标签:10 include int 常考 high ++ 算法 low 排序

冒泡排序

#include<iostream>
#include<string>
using namespace std;
//void Shellsort(int A[], int n)
//{
//    int d, i, j;
//    for (d = n / 2; d >= 1; d = d / 2)
//    {
//        for (i = d + 1; i <= n; i++)
//        {
//            if (A[i] <=A[i - d])
//            {
//                A[0] = A[i];
//                for (j = i - d; j > 0 && A[0] < A[j]; j -= d)
//                    A[j + d] = A[j];
//                A[j + d] = A[0];
//            }
//
//        }
//    }
//}
void bullsort(int A[], int n)
{
    for (int i = 0; i < n - 1; i++)
    {
        bool flag = false;
        for (int j = 0; j <n-i - 1; j++)
        {
            if(A[j]>A[j+1])
            {
                int temp = A[j];
                A[j] = A[j + 1];
                A[j + 1] = temp;
                flag = true;
            }
        }
        if (flag == false)
            return;
    }
}
int main()
{
    int a[100];
    for (int i =0; i < 10; i++)
    {
        cin >> a[i];
    }
    //Shellsort(a, 10);
    /*for (int i = 1; i < 10; i++)
    {
        cout << a[i] << " ";
    }*/
    bullsort(a, 10);
    for (int i = 0; i < 10; i++)
    {
        cout << a[i] << " ";
    }
}

选择排序

#include<iostream>
#include<string>
using namespace std;
void selectsort(int 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)
        {
            int temp = A[min];
            A[min] = A[i];
            A[i] = temp;
        }
    }
}
int main()
{
    int a[100];
    for (int i =0; i < 10; i++)
    {
        cin >> a[i];
    }
    selectsort(a, 10);
    for (int i = 0; i < 10; i++)
    {
        cout << a[i] << " ";
    }
}

快速排序

#include<iostream>
#include<string>
using namespace std;
int partition(int A[], int low, int high)
{
    int 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(int A[], int low, int high)
{
    if (low < high)
    {
        int pivotpos = partition(A, low, high);
        quicksort(A, low, pivotpos - 1);
        quicksort(A, pivotpos + 1, high);
    }
}
int main()
{
    int a[100];
    for (int i =0; i < 10; i++)
    {
        cin >> a[i];
    }
    quicksort(a, 0,9);
    for (int i = 0; i < 10; i++)
    {
        cout << a[i] << " ";
    }
}

堆排序

#include<iostream>
#include<string>
using namespace std;
void Headadjust(int A[], int k, int len)//将以k为根的子树调整为大根堆
{
    A[0] = A[k];//A[0]暂存子树的根节点
    for (int i = 2 * k; i <= len; i *= 2)//沿key较大的子节点向下筛选
    {
        if (i < len && A[i] < A[i + 1])i++;//取key较大的子节点的下标
        if (A[0] >= A[i]) break;//筛选结束
        else {
            A[k] = A[i];//将A[i]调整到双亲结点上
            k = i;//修改k值,以便继续向下筛选
        }
    }
    A[k] = A[0];
}
void Buildmaxheap(int A[], int len)//建立大根堆
{
    for (int i = len / 2; i > 0; i--)
    {
        Headadjust(A, i, len);
    }
}
void Heapsort(int A[], int len)
{
    Buildmaxheap(A, len);//初始建堆
    for (int i = len; i > 1; i--)
    {
        int temp = A[i];//堆顶元素和堆底元素交换
        A[i] = A[1];
        A[1] = temp;
        Headadjust(A, 1, i - 1);//把剩余的待排序元素整理成堆
    }
}
int main()
{
    int a[100] = { 0 };
    for (int i = 1; i <= 10; i++)
    {
        cin >> a[i];
    }
    Heapsort(a, 10);
    for (int i = 1; i <= 10; i++)
    {
        cout<<a[i]<<" ";
    }
}

归并排序

#include<iostream>
#include<string>
using namespace std;
int B[100] = { 0 };//辅助队列
//各自有序,将两个部分归并
void Merge(int 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++];//将较小值复制到A中
        }
        else {
            A[k] = B[j++];
        }
    }
    while (i <= mid) A[k++] = B[i++];
    while (j <= high) A[k++] = B[j++];
}
void Mergesort(int 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);//归并
    }
}
int main()
{
    int a[100] = { 0 };
    for (int i = 0; i < 10; i++)
    {
        cin >> a[i];
    }
    Mergesort(a, 0, 9);
    for (int i = 0; i < 10; i++)
    {
        cout << a[i] << " ";
    }

}

希尔排序

#include<iostream>
#include<string>
using namespace std;
void Shellsort(int A[], int n)
{
    int d, i, j;
    for (d = n / 2; d >= 1; d = d / 2)
    {
        for (i = d + 1; i <= n; i++)
        {
            if (A[i] <=A[i - d])
            {
                A[0] = A[i];
                for (j = i - d; j > 0 && A[0] < A[j]; j -= d)
                    A[j + d] = A[j];
                A[j + d] = A[0];
            }

        }
    }
}

int main()
{
    int a[100];
    for (int i =1; i <= 10; i++)
    {
        cin >> a[i];
    }
    Shellsort(a, 10);
    for (int i = 1; i <= 10; i++)
    {
        cout << a[i] << " ";
    }
}

标签:10,include,int,常考,high,++,算法,low,排序
From: https://blog.csdn.net/qq_46248132/article/details/143586237

相关文章

  • JavaScript Kruskal 最小生成树 (MST) 算法(Kruskal’s Minimum Spanning Tree (MST) A
             对于加权、连通、无向图,最小生成树(MST)或最小权重生成树是权重小于或等于其他所有生成树权重的生成树。Kruskal算法简介:        在这里,我们将讨论Kruskal算法来查找给定加权图的MST。         在Kruskal算法中,按升序对给定图的所......
  • 基于springboot框架在线生鲜商城推荐系统 java实现个性化生鲜/农产品购物商城推荐网站
    基于springboot框架在线生鲜商城推荐系统java实现个性化生鲜/农产品购物商城推荐网站爬虫、数据分析、排行榜基于协同过滤算法推荐、基于流行度热点推荐、平均加权混合推荐机器学习、大数据、深度学习OnlineShopRecommendEx一、项目简介1、开发工具和使用技术IDEA,jdk......
  • 【算法学习】反悔贪心
    前言反悔贪心,先选择局部最优,当不断向后更新时发现前面的决策在现在来看并不优就进行调整过去决策进行局部最优,可以说反悔贪心一步步扩宽自己的视野从而明白过去的错误。、如果动态规划是将各种削苹果的方式都展示出来的话,那反悔贪心就是削一下补回来一点再削。当然反悔贪心的题......
  • C语言数据结构--详细讲解算法复杂度
    C语言数据结构-算法复杂度前言一、时间复杂度1.大O渐进表示法2时间复杂度的计算二、空间复杂度1.什么是空间复杂度2时间复杂度的计算总结前言我们都清楚计算机存储和组织数据是通过数据结构来实现的。当计算机对这些数据结构中的数据进行遍历等操作时,这个过程就......
  • 代码随想录算法训练营第十八天|leetcode530.二叉搜索树的最小绝对差、leetcode501.二
    1leetcode530.二叉搜索树的最小绝对差题目链接:530.二叉搜索树的最小绝对差-力扣(LeetCode)文章链接:代码随想录视频链接:你对二叉搜索树了解的还不够!|LeetCode:98.验证二叉搜索树_哔哩哔哩_bilibili思路:定义一个极大值作为结果,然后在中序遍历过程中进行比较出结果1.1自己的......
  • 算法笔记——马拉核弹(Mana Nuclear)
    0x00摘要“马拉核弹”算法由SXHT同学(2009~今)发明,并在2024年11月于某不知名学校机房内正式公布。该算法基于1975年发明的Manacher算法,并将其推广至对称正方形问题。原文链接与密码:sunxuhetai2009。关键词:Manacher算法信息学对称正方形0x01缘由先来看这道题目:......
  • Python——数据结构与算法-时间复杂度&空间复杂度-链表&树状结构
    1.数据结构和算法简介程序可以理解为:程序=数据结构+算法概述/目的:都可以提高程序的效率(性能)数据结构指的是存储,组织数据的方式.算法指的是为了解决实际业务问题而思考思路和方法,就叫:算法.2.算法的5大特性介绍概述:为了解决实际业务问题,......
  • 基于GA-PSO-SVM算法的混沌背景下微弱信号检测matlab仿真
    1.算法运行效果图预览(完整程序运行后无水印) svm参数取值对检测性能的影响: SVM,PSO,GA-PSO-SVM的检测性能对比: 2.算法运行软件版本matlab2022a 3.部分核心程序(完整版代码包含详细中文注释和操作步骤视频,参考文献,说明文档)loadGAPSO.mat%调用四个最优的......
  • 经典算法思想总结
    在计算机科学的世界里,算法是解决问题的核心工具。它们不仅定义了如何解决问题,还决定了解决问题的效率。以下是一些经典算法思想的总结,这些思想跨越了多个领域,从数据结构到机器学习,都是构建高效算法的基石。1.分治法(DivideandConquer)分治法是一种将问题分解成更小的子问......
  • C++算法相关一些小细节
    C++算法相关一些小细节cin>>stl;//输入字符串时,遇到空格或者回车就会停止cout<<stl<<endl;//输出字符串时,遇到空格或者回车不会停止若要往字符数组读入一行字符串,包括空格,那么就要写成           String类1. 2.3.不能用printf直接......