基本的排序算法C++实现(插入排序,选择排序,冒泡排序,归并排序,快速排序,最大堆排序,希尔排序)

2023-05-16

动图演示: 

https://www.cnblogs.com/onepixel/articles/7674659.html

冒泡排序
#include <bits/stdc++.h> //偷懒的写法,不过编译时间比较久,包含大部分头文件
#include <algorithm>
#include <vector>
bubble_sotr(vector<int> &arr)
{
   
	
	for(int i=0 ; i< arr.size()-1; i++)
	{   
	    bool flag = false;
		for(int j = 0;j < arr.size()-i;j++)
		{
			if(arr[j]>arr[j+1])
			{
			
			   //int temp = arr[j];
			   //arr[j]= arr[j+1];
			   //arr[j+1] = temp;
			   swap(arr[j],arr[j+1]);
			   flag = true; 
			}
		}
		if(!falg) //冒泡排序的优化
		break;
		
	}
}
//选择排序
select_sort1(vector<int> &arr)
{
    for(int i=0; i < arr.size();i++)
	{
	    for(int j=i+1;j<arr.size();j++)
		{
		    if(arr[i]<arr[j])//把最小的数取出来放到第一个位置
			    swap(arr[i],arr[j]);
		
		}
	
	}
}

void select_sort2(vector<int> &arr)
{   int min_index = 0;
    for(int i=0; i < arr.size();i++)
	{
	    for(int j=i+1;j<arr.size();j++)
		{
		    if(arr[j]<arr[min_index])//把最小的数取出来放到第一个位置
			    min_index = j;   //保留最小数的索引
		
		}
		swap(arr[i],arr[min_index]);//把最小数放到对应的前面
	}
}
给定一个序列。如果使用冒泡排序,需要swap多少次?

插入排序:  原理和玩扑克差不多。
前面的牌是有序的
void insert_sort(vector<int> &arr)
{
    for(int i = 1; i<arr.size();i++)
	{
	    int temp = arr[i];
	    for(int j=i-1;j >= 0;j--)
		{
		    if(arr[i]<arr[j])
			{
			    arr[j+1]=arr[j];
			}else{
			    break;//这个地方很重要,如果这个数与前一个数相比,比前一个数大,那么他的位置就不需要移动
			}
		}
		arr[j+1]=temp;
	}
}
//希尔排序 缩小增量排序(不稳定)
void shell_sort(vector<int> &arr)
{
    算法思想:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序
	将一组数字,按步长为3/n分为一组,分为3组。每一组按插入排序,每组的下标间隔为g步长
	第二次按步长为2分为2组,每组按插入排序
	第三次按步长为1,按插入排序。
    

}

int main()
{
  int n;
  vector<int> arr;
  cin >> n;
  for(int i=0,t;i<n;i++)
  {
	  cin >> t;
	  arr.push_back(t);
  
  }
  
  bubble_sotr(arr);
  for(auto x:arr) 
	  cout<< x <<' ';
  cout<<endl;

}

https://www.cnblogs.com/chenxiwenruo/p/8529525.html

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string.h>
#include <cstdlib>
#include <ctime>
using namespace std;
//----------------插入排序--------------------------
void insertSort(int a[],int len){
    for(int i=1;i<len;i++){
        int tmp=a[i];
        int j=i-1;
        while(j>=0 && tmp<a[j]){
            a[j+1]=a[j];
            j--;
        }
        a[j+1]=tmp;
    }
}
//----------------选择排序--------------------------
void selectSort(int a[],int len){
    for(int i=0;i<len-1;i++){
        int minidx=i;
        for(int j=i+1;j<len;j++){
            if(a[j]<a[minidx]){
                minidx=j;
            }
        }
        if(a[i]>a[minidx]){
            int tmp=a[i];
            a[i]=a[minidx];
            a[minidx]=tmp;
        }
    }
}
//----------------冒泡排序--------------------------
void bubbleSort(int a[],int len){
    int tmp;
    for(int i=0;i<len-1;i++){
        bool flag=true;
        for(int j=0;j<len-i-1;j++){
            if(a[j]>a[j+1]){
                tmp=a[j+1];
                a[j+1]=a[j];
                a[j]=tmp;
                flag=false;
            }
        }
        if(flag)
            break;
    }
}
//----------------归并排序O(NlgN)--------------------------
#define INF 0x3f3f3f3f
/*
将[l,mid]和[mid+1,r]两个区间进行合并,每次取两个开头最小的那个
*/
void merges(int a[],int l,int mid,int r){
    int len1=mid-l+1;
    int len2=r-mid;
    int L[len1+1],R[len2+1];
    for(int i=0;i<len1;i++)
        L[i]=a[l+i];
    for(int i=0;i<len2;i++)
        R[i]=a[mid+1+i];
    L[len1]=INF;
    R[len2]=INF;
    int left=0,right=0;
    for(int k=l;k<=r;k++){
        if(L[left]<=R[right]){
            a[k]=L[left];
            left++;
        }
        else{
            a[k]=R[right];
            right++;
        }
    }
}
//对区间[l,r]进行归并排序
void mergeSort(int a[],int l,int r){
    if(l<r){
        int mid=(r+l)/2;
        mergeSort(a,l,mid);
        mergeSort(a,mid+1,r);
        merges(a,l,mid,r);
    }
}
//----------------快速排序O(NlgN)--------------------------
/*
以最后a[r]为划分点,将数组a划分成两个部分
前部分<=a[r],后部分>a[r]
最后返回a[r]的索引
*/
int quick_partition(int a[],int l,int r){
    int x=a[r];
    int i=l-1;
    for(int j=l;j<r;j++){
        if(a[j]<=x){
            i++;
            swap(a[i],a[j]);
        }
    }
    swap(a[i+1],a[r]);
    return i+1;

}
void quickSort(int a[],int l,int r){
    if(l<r){
        int mid=quick_partition(a,l,r);
        quickSort(a,l,mid-1);
        quickSort(a,mid+1,r);
    }
}


int main()
{
    int num=10;
    int a[num];
    srand((unsigned)time(NULL));
    for(int i=0;i<num;i++){
        a[i]=rand()%20;
        printf("%d ",a[i]);
    }
    printf("\n");
    quickSort(a,0,num-1);
    for(int i=0;i<num;i++){
        printf("%d ",a[i]);
    }
    return 0;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基本的排序算法C++实现(插入排序,选择排序,冒泡排序,归并排序,快速排序,最大堆排序,希尔排序) 的相关文章

  • 常用的vi/vim命令

    转载自 xff1a https blog csdn net wang907553141 article details 78846784 常用的vi vim命令 xff1a vi命令 xff1a yy xff1a 复制 光标所在的这一行 n
  • sql中limit使用方法

    sql中limit使用方法 此处以mysql为例 xff0c 但是我相信物以变通在oracle上也一定适用 1 下面是几种limit的方法 xff1a 原则看看下面几个例子应该就懂了 在数据库中很多地方都会用到 xff0c 比如当你数据库查
  • 数据库sql的优化问题的面试题

    想一下这个道面试题怎么做 有一张user表有1000万条数据 xff0c 请为下面的sql提供优化建议 xff1f 字段分别为 xff1a 主键id xff0c 用户id xff0c 姓名 xff0c 性别 select from user
  • 日期加一天的函数

    bool isLeapYear int year if year 4 61 61 0 amp amp year 100 61 0 year 400 61 61 0 判断闰年 return true return false void add
  • SpringAOP简单案例

    简介 本文是一个老师在学校给学生上课的简单案例 xff0c 介绍了AOP的五个通知的使用 xff0c 以及通知的执行顺序 通过自定义注解来充当切入点 xff0c 获取注解的类型分别对不同的老师做对应的业务处理 代码中的消息响应体 xff08
  • 学习 shell脚本之前的基础知识

    转载自http www 92csz com study linux 12 htm 日常的linux系统管理工作中必不可少的就是shell脚本 xff0c 如果不会写shell脚本 xff0c 那么你就不算一个合格的管理员 目前很多单位在招聘
  • Linux入门教程

    http www 92csz com study linux 发现这个写的不错 xff0c 作为小白入门非常棒 xff01
  • c与c++的区别

    相同 xff1a C 43 43 是在C语言的基础上改进的 xff0c C语言的很多语法在 C 43 43 中依然广泛使用 xff0c 例如 xff1a C 43 43 仍然使用 char short int long float doub
  • 多线程--线程管理

    说到多线程编程 xff0c 那么就不得不提并行和并发 xff0c 多线程是实现并发 xff08 并行 xff09 的一种手段 并行是指两个或多个独立的操作同时进行 注意这里是同时进行 xff0c 区别于并发 xff0c 在一个时间段内执行多
  • 选择排序和冒泡排序

    void select sort int a int n 选择排序 选择排序 xff0c 每次选择最小的放在第一个位置 xff0c 然后下次从第二个位置开始 for i 61 0 i lt n 1 43 43 i j 61 i 给下标放在一
  • 数据库面试题

    1 数据库系统的核心是 A 数据模型B 数据库管理系统C 软件工具D 数据库 2 下列叙述中正确的是 A 数据库是一个独立的系统 xff0c 不需要操作系统的支持 B 数据库设计是指设计数据库管理系统 C 数据库技术的根本目标是要解决数据共
  • 什么是shell?

    操作系统与外部最主要的接口就叫做shell shell是操作系统最外面的一层 shell管理你与操作系统之间的交互 等待你输入 xff0c 向操作系统解释你的输入 xff0c 并且处理各种各样的操作系统的输出结果 shell提供了你与操作系
  • 《心流》——每天十分钟,解读完本书

    心流 每天十分钟 xff0c 解读完本书 你好 xff01 这里是 每天十分钟 xff0c 解读完本书 xff0c 我是财哥哥 xff0c 今天为你解读的是 心流 xff0c 作者是米哈里 契克森米哈赖 他是积极心理体验这一领域的权威学者
  • SourceInsight4.0的使用

    转自 xff1a https blog csdn net qq 39660930 article details 77499455 一 项目管理 1 新建一个项目 快捷键Alt 43 Shift 43 N可以打开新建项目对话框 xff0c
  • 输入一个英文句子,翻转句子中的单词,要求单词内的字符顺序不变。 如:I am a student. 转换成 student. a am I

    输入一个英文句子 xff0c 翻转句子中的单词 xff0c 要求单词内的字符顺序不变 如 xff1a I am a student 转换成 student a am I 算法分析 xff1a 1 通过ReverseString xff08
  • OpenMLDB开源社区贡献者体系今日发布

    关于OpenMLDB OpenMLDB 是一个开源机器学习数据库 xff0c 提供企业级 FeatureOps 全栈解决方案 OpenMLDB 致力于闭环解决 AI 工程化落地的数据治理难题 xff0c 并且已经在上百个企业级人工智能场景中
  • 排序算法

    影响排序算法性能的几个要素 xff1a 1 时间性能 2 辅助空间 3 算法的复杂性 直接插入排序算法的基本操作是将一个记录插入到已经排好序的有序表中 xff0c 从而得到一个新的 xff0c 记录数增加一的有序表 void InsertS
  • c语言常用小知识点总结1

    define 用来定义宏常量 格式 xff1a define 标识符 大写字母 常量 define PI 3 14 注意后面是不加 分号的 常用字母的ASCII码 39 a 39 61 97 39 A 39 61 65 39 0 39 61
  • 数据结构学习笔记1

    程序设计 61 数据结构 43 算法 谈谈算法 数据结构与算法是 好基友 xff0c 如果单独谈数据结构 xff0c 或者单独谈算法是没什么意义的 来一个牛叉的算法吧 xff01 计算1 43 2 43 3 43 4 43 100 xff0
  • Oracle面试题附带答案

    1 你要对操纵Oracle数据库中的数据 下列哪个选项表示Oracle中select语句的功能 xff0c 并且不需要使用子查询 xff08 C xff09 A xff0e 可以用select语句改变Oracle中的数据 B xff0e 可

随机推荐

  • C结构体中数据的内存对齐问题

    转自 xff1a http www cnblogs com qwcbeyond archive 2012 05 08 2490897 html 32位机一般默认4字节对齐 xff08 32位机机器字长4字节 xff09 xff0c 64位机
  • 解决codeblocks无法调试的问题

    错误提示 xff1a ERROR You need to specify a debugger program in the debuggers 39 s settings For MinGW compilers it 39 s 39 gd
  • 求出现在字符串1而没有出现在字符串2中的字符

    编写一个函数 xff0c 它的功能是将未在字符串s中出现 xff0c 而在字符串t中出现的字符 xff0c 型参一个新的字符串放在u中 xff0c u中的字符按原字符的顺序排列 xff0c 但要去掉重复字符 至少会想到去考察t xff0c
  • 什么情况下需要建立索引? 索引的作用?为什么能够提高查询速度?(索引的原理) 索引有什么副作用吗?

    https www cnblogs com Berryxiong p 6249427 html 为什么能够提高查询速度 xff1f 索引就是通过事先排好序 xff0c 从而在查找时可以应用二分查找等高效率的算法 一般的顺序查找 xff0c
  • 100w测试数据,为什么加了索引查询反而变慢了?

    建表 xff1a create table tb test fval varchar 50 插入测试数据 xff1a DELIMITER CREATE DEFINER 61 96 root 96 64 96 localhost 96 PRO
  • linux环境下使用gdb调试c和c++ 学习笔记

    第二十三课 xff1a GDB简介 哔哩哔哩 bilibili gdb调试 xff1a 1 gcc a c b c c c o app g g 编译器会保留函数名和变量名 2 启动gdb gdb 可执行程序的名字 xff08 gdb app
  • ubuntu下eth0网卡信息不见了

    ubuntu终端下命令ifconfig的问题解决 问题一 ifconfig之后只显示lo 没有看到eth0 问题二 ifconfig之后显示eth0 xff0c 但是没有显示静态IP地址 xff0c 即无inet 地址 广播 掩码 问题三
  • 计算机指令

    指令系统的设计原则包括 xff1a 完备性 xff1a 该有的都要有 有效性 xff1a 简洁 加速常用操作 没有歧义 规整性 xff1a 对称 均匀 一致 xff08 简单源于规整 xff09 兼容性 xff1a 之前 之后的都能用 下面
  • shell基础学习笔记1

    shell是什么 xff1f shell是一个命令解释器 xff0c 他为用户提供了一个向linux内核发送请求以便运行程序的界面系统级程序 xff0c 用户可以用shell来启动 挂起 停止甚至编写一些程序 其实就是输入命令的那个交互界面
  • linux达人养成学习笔记1

    2 4 分区之分区设备文件名与挂载 1 swap分区 xff0c 没有挂载点 xff0c 是文件系统类型 xff08 交换分区 xff0c 电脑内存 lt 4G xff0c 可分为内存2倍 xff1b gt 4G分同等大小 xff09 2
  • shell编程之变量学习小结

    在Bash中 xff0c 变量的默认类型都是字符串型 变量的分类 1 用户自定义变量 xff1a 变量可以自定义 xff0c 但是对系统生效的环境变量名和变量作用是固定的 2 环境变量 xff1a 这种变量中主要保存的是和系统操作环境相关的
  • 程序员的自我修养

    1 Provide Options Don 39 t make lame Excuses 提供各种选择 xff0c 不要找蹩脚的借口 2 Don 39 t live with Broken Windows 不要容忍破窗户 3 Be a ca
  • 二阶三阶四阶魔方旋转公式

  • 什么是回调函数?

    为了弄明白这种函数的奥妙 xff0c 首先提出三个问题 xff1a 1 回调函数是什么东西 xff1f 2 回调函数怎么开发 xff0c 怎么使用 xff1f 3 回调函数的作用 xff0c 应该在什么情况下使用 xff1f 带着问题来学习
  • Toastmasters会议小结

    第四战队第二次会议记录 舰队分享 P1 Ice Breaker Speech 分享人 xff1a 邱爱珍 爱珍结合自己的P1演讲经验 xff0c 从以下五个方面给出相应的意见 Book time to start 尽早在系统中预约自己的第一
  • 如何做好自己的时间管理

    认识时间障碍掌握时间管理的原则掌握各种有效管理隔个人时间的工具 没有目标谈什么时间管理 xff1f xff1f xff1f 今天需要完成的事情 这个周需要完成的事情 这个月需要完成的事情 时间管理的错误观念 时间管理只是常识 xff0c 只
  • 参考别人的面试总结:linux C/C++服务器后台开发面试题总结

    参考别人的面试总结 xff1a linux C C 43 43 服务器后台开发面试题总结 参考博客 xff1a http www cnblogs com nancymake p 6516933 html 基础语言知识方面 xff1a 1 使
  • 常用Git命令

    查看文件当前状态 xff1a git status 查看文件提交信息 xff1a git log 将未被追踪的文件 xff08 工作区 xff09 提交至暂存区 xff1a git add 文件名 所有修改的文件提交至暂存区 xff1a g
  • 直接插入排序算法实现学习

    include lt iostream gt using namespace std void show int a int n for int i 61 0 i lt n i 43 43 cout lt lt a i lt lt 34 t
  • 基本的排序算法C++实现(插入排序,选择排序,冒泡排序,归并排序,快速排序,最大堆排序,希尔排序)

    动图演示 xff1a https www cnblogs com onepixel articles 7674659 html 冒泡排序 include lt bits stdc 43 43 h gt 偷懒的写法 xff0c 不过编译时间比