冒泡、插入、选择排序及其改进

排序算法——冒泡排序、选择排序、插入排序、希尔排序、归并排序 一、冒泡排序、冒泡排序的优化算法 1.冒泡排序的概念 冒泡排序是一种简单的排序算法,它重复的访问要排序的数列,一次进行两个元素的比较操作,如果不符合则元素之间进行交换。重复进行元素之间的比较操作,直到元素不再需要交换,继而该排序过程已经完成。 2. 冒泡排序的算法描述 a. 比较相邻的元素如果第一个比第二个大,就交换这两个元素; b. 每一趟最后的元素就是最大的元素; c. 重复以上步骤,直到排序... 阅读详情

这三种排序方式可以说是最简单,最常用的三种排序方式了。

值得说的是,在每种排序之后我都附加了其改进版本。

冒泡排序

普通冒泡排序

void bubble_sort( int *array, int size )
{
    int i, j, temp;
    if ( size <= 1 )
        return ;
    //i控制遍历数组的次数
    //如果要排序size个数字,只需要遍历数组size-1即可
    //因为每遍历一次数组就会有一个数字被排好序,
    //最后一个数字在前面的数字都排好序之后会自然处于正确的位置
    for ( i = 0; i < size-1; ++i )
        //j控制每次遍历数组需要遍历的数字个数
        for ( j = 0; j < size-1-i; ++j )
        {
            if ( array[j] > array[j+1] )
            {
                temp = array[j];
                array[j] = array[j+1];
                array[j+1] = temp;
            }
        }
}

改进一:

冒泡排序中如果这一趟里面没有交换任何元素,说明数组中每个元素都一排好序。就不用再继续比较了。

void bubble_sort_adv1( int *array, int size )
{
    int i, j, temp;
    int flag = 1;       //增加标记,标记这一趟有没有交换过元素 1 交换过 0 没有交换过
    for ( i = 0; i < size-1 && flag; i++ )
    {
        flag = 0;     //每次开始一趟之前设flag为0
        for ( j = 0; j < size-i-1; ++j )
        {
            if ( array[j] > array[j+1]  )
            {
                //出现交换
                flag = 1;
                temp = array[j];
                array[j] = array[j+1];
                array[j+1] = temp;
            }
        }
    }
}

改进二:

每次记住每趟第一次交换的位置和最后一次交换的位置,第一次交换位置之前的元素都已经排好序了,同理,最后一次交换的位置之后的元素都已经排好序了,这个不难想到,手动走一遍冒泡排序就可以看出来了,知道了这个规律就可以写出下面的代码了。

void bubble_sort_adv2( int *array, int size )
{
    int i, j, temp;
    //last_swap_end  记录本趟最后一次交换的位置
    //last_swap_start 本趟第一次交换的位置
    int last_swap_end = size - 1, last_swap_start = 0;
    int q = size -1;
    int p = last_swap_start;
    int first_flag = 1;     //记录是否为第一次交换

    for ( i = 0; i < size-1; i++ )
    {
        for ( j = p; j < q; j++ )
        {
            if ( array[j] > array[j+1] )
            {
                temp = array[j];
                array[j] = array[j+1];
                array[j+1] = temp;
                last_swap_end = j;
                if ( first_flag )
                {
                    last_swap_start = j == 0 ? 0 : j -1;
                    first_flag = 0;
                }
            }

        }
        q = last_swap_end;
        first_flag = 1;
        p = last_swap_start;
    }
}

插入排序

//普通插入排序
void insert_sort( int *array, int size )
{
    int i, j, temp;
    if ( size <= 1 )
        return ;
    for ( i = 1; i < size; i++ )
    {
        for ( j = i; j > 0; j-- )
        {
            if ( array[j] >= array[j-1] )
                break;
            temp = array[j];
            array[j] = array[j-1];
            array[j-1] = temp;
        }
    }
}

改进一:融合二分查找

//哨兵和二分查找相结合的插入排序
void insert_sort_adv2( int *array, int size )
{
    int i, j, target;
    int k;
    for ( i = 1; i < size; ++i )
    {
        target = array[i];
        //找到target应该插入的位置
        k = bin_search( array, 0, i, target );
        for ( j = i-1; j >= k; --j )
        {
            array[j+1] = array[j];
        }
        array[k] = target;
    }
}

//[start, end)
//target在array中存在,返回对应下标,不存在返回较大下标
int bin_search( int *array, int start, int end, int target )
{
    while ( start < end )
    {
        int mid = ( start + end ) / 2;
        if ( array[mid] == target )
            return mid;
        else if ( array[mid] < target )
            start = mid+1;
        else
            end = mid;
    }
    return start;
}

改进二:加入哨兵位

//带哨兵的插入排序
void insert_sort_adv1( int *array, int size )
{
    int i, j, temp;
    int sentry;
    for ( i = 1; i < size; ++i )
    {
        sentry = array[i];
        for ( j = i-1; j >= 0; j-- )
        {
            if ( sentry < array[j] )
                array[j+1] = array[j];
            else break;
        }
        if ( j+1 != i )
            array[j+1] = sentry;
    }
}

选择排序

普通选择排序

void select_sort( int *array, int size )
{
    if ( size <= 1 )    return ;
    int i, j, temp;
    int mini;
    for ( i = 0; i < size-1; ++i )
    {
        mini = i;
        for ( j = i+1; j < size; ++j )
            if ( array[mini] > array[j] )
                mini = j;
        if ( mini == i )
            continue;
        temp = array[mini];
        array[mini] = array[i];
        array[i] = temp;
    }
}

改进:二元选择排序

普通的选择排序每遍历一次只能找到最小元素,但是其实再一次遍历中同时找到最大元素,这样每次遍历就能确定两个元素的位置。

//二元选择排序
void select_sort_adv1( int *array, int size )
{
    int i, j, temp;
    int mini; int maxi;
    for ( i = 0; i < size/2; i++ )
    {
        mini = i;
        maxi = i;
        for ( j = i+1; j < size-i; j++ )
        {
            if ( array[j] < array[mini] )
                mini = j;
            else if ( array[j] > array[maxi] )
                maxi = j;
        }
        if ( mini != i )
            swap( &array[i], &array[mini] );
        if ( maxi != i && maxi != j )
            swap( &array[j-1], &array[maxi] );
    }
}
ABAP 7.40+新语法实战:用VALUE和REDUCE五分钟搞定复杂内表统计 本文详细介绍了ABAP 7.40+新语法中的VALUE和REDUCE操作符,如何高效处理复杂内表统计任务。通过实战案例展示,这些新语法能将代码量减少70%以上,显著提升开发效率和可读性,特别适合大数据量下的销售数据分析、分组统计等场景。 阅读详情

相关推荐

Windows下CMake的下载与安装详解

目录一、CMake介绍二、CMake的下载与安装 一、CMake介绍 CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。它能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。 二、CMake的下载与安装 CMake下载链接:https://cmake.org/download/。 下载最新稳定版即可(Latest Release): 下载完成后,单击“Next”按钮,在下图中勾选“I acce

Wendy的博客 8万+

冒泡排序和选择排序

冒泡排序 主要采用相邻数两两进行比较的思想。如果后一个比前一个大(小),则将其调换位置,直至所有的数都比较完。数组长度N第一次比较N-1次,第二次比较N-2次。总比较次数为(N-1)+(N-2)+…+2+1次。 #include "iostream" /*冒泡排序 从前到后最大值依次向后浮出, 第一次N个数比较N-1次,第二次比较N-2次 */ using namespace std; int main() { int temp = 0; int len = 0; int a[] =

hankobe1的博客 600

ITK-snap进行分割区域标注、三维显示及改变显示颜色

在进行医学图像器官分割时,无论我们是用传统方法还是深度学习,最后肯定要用到手动分割的区域作为金标准来验证我们方法的精度。但是手动标注器官的轮廓是十分耗时的,这里我介绍一个比较简单的标注方法,以肺分割作为例子。 我们使用ITK-snap作为分割标注工具。 当切片间距离比较小时,比如1mm,一个患者的完整HRCT序列通常在200张以上,如果让医生一一进行分割区域标注是非常耗时乏味的。因此,我们可以使用最简单的阈值法比如OSTU,加上基本的形态学操作对肺进行粗分割得到粗略的分割掩码,在此基础上再手动的对分割结果进

u010409517的博客 2万+

数据结构中的排序--选择(select)排序

选择排序和冒泡排序不管是在算法的思路上还是代码的实现上都差别不大。不同在于,选择排序可以算作是冒泡排序的一种改进,这种改进主要体现在数据的移动次数上面。冒泡排序每次比较后,如果后面的元素有和比当前的元素大或者小,就会交换位置。而选择排序,比较后是记录当前的最小值得位置,一趟比较完成后才做交换。这样的话,就减少了交换的次数。 选择排序的代码实现如下: #include "stdafx.h" #...

仗劍走天涯 730

vuecli3 实现 移动端和pc端 界面切换(两套代码)

适合场景 多页面多系统应用 所有系统都在同一目录下。配置多入口多出口。每个系统之间可以链接。每个系统内依然采用Vue单页应用开发。 产品需求:一套代码 兼容pc端和移动端 , 移动端和pc端的样式布局差别很大,需要使用多界面,并判断使用手机的时候跳转移动端代码,使用pc端跳转pc端代码。 项目目录 分为两部分代码,pc 和mobile 第一步:创建一个登陆页面的文件 在项目public文件夹下创建一个login.html,其实就是将index.html复制一份,将title改一下: <!DOCTYP

你怎么也喜欢嘴巴嘟嘟 5922

VLA、世界模型与端到端在智驾中的本质关系与工程落地

世界模型并非3D重建,而是对环境状态转移函数的可微分建模;VLA不是视觉+语言+动作的简单拼接,核心在于跨模态语义对齐。二者共同支撑具身智能系统实现从感知到行动的闭环推演,其技术价值体现在长尾场景泛化能力提升与决策延迟降低。在自动驾驶领域,真实量产方案均采用VLA架构作为多模态感知基础,嵌入轻量级世界模型以支持反事实轨迹推演,并通过WA硬件封装保障实时性,最终由端到端控制层完成像素到扭矩的语义贯通。这种混合架构已成L2+/L3智驾系统的工程共识。

weixin_34163553的博客 366

选择排序,冒泡排序及改进

本人是个编程小白,刚接触编程不久,学习了选择排序,冒泡排序这两个简单的排序方法,为了能更好的去啃那几个高级排序,以及方便以后研究更高深的算法,所以决定自己写一下,巩固基础,把地基打牢。 一,选择排序法 1,算法思想 (1),在未排序的序列中找到最大(小)的数,放到起始位置构成有序序列 (2),接着遍历剩下的序列,找到最大(小)的数,放在有序序列末尾 (3),不断遍历,直到排序完成 2,算法分析 (1),平均时间复杂度:O(n2) (2),空间复杂度:O(1) //空间复...

m0_63134260的博客 1240

PX4无人机PID调参实战:从零到稳定飞行的关键步骤

本文详细介绍了PX4无人机PID调参的实战步骤,从理解双环控制结构到实战调参三部曲,帮助飞手解决飞行抖动、电机发热等常见问题。通过分析飞行日志、调整速率环P值、引入积分I和微调角度环与微分D,实现从零到稳定飞行的关键跨越,是无人机飞控调试的必修课。

weixin_29269441的博客 527

数据结构与算法——12. 冒泡排序和选择排序

文章目录一、冒泡排序(Bubble Sort)python代码实现算法分析改进冒泡排序算法二、选择排序(Selection Sort)python代码实现算法分析 排序算法可视化演示:传送门,这些演示可以帮助我们跟好的理解这些排序算法。 下面的算法的实现,均以从小到大排序作为目的。 一、冒泡排序(Bubble Sort) 冒泡排序的算法思路在于对无序表进行多趟比较交换。 每趟包括了多次两两相邻比较,并将逆序的(小项在大项后面的)数据项互换位置,最终能将本趟的最大项就位。 经过n-1趟比较交换,实现整表排

花城的博客 1591

Vue3 - 最新详细实现网站内部打开预览 office 全套附件,在页面弹窗内解析预览 word文档、excel电子表格、ppt演示文稿(docx|xlsx|pptx|pdf|txt等文件)完美兼容

vue3,nuxt3,下载预览,如何预览pdf文档,打开查看,office全套文档,实现在线预览文件,小程序内预览word文件,手机h5移动端网页,nuxt文档在线预览,预览office最好用的插件,office,文档,文件,查看预览,弹框预览,文档无法解析,打不开,报错,失效,保存下载,vue前端预览并下载doc、xls、pdf、txt及图片,下载查看,Office在线预览,vue-office,vue如何使用vue-office教程示例,word文档,ppt,exce表格,预览电子文件,vue在线预览

🏆 前端领域优质创作者 1万+

基于FPGA的数字信号处理(17)--定点运算的实现实例(饱和Saturate与四舍五入Round)

基于FPGA的数字信号处理(17)--定点运算的实现实例(饱和Saturate与四舍五入Round)

孤独的单刀 2960

10种排序算法笔记总结(二)选择排序、堆排序和冒泡排序及冒泡排序的改进

④选择排序:以升序排序为例:刷吗在一组数据对象v[0]v[1]v[2]........v[n-1]中选择最小关键码的对象,若他不是对象序列中的第一个对象,则将它与第一个对象对调,然后在这组对象中剔除具有最小关键码的对象,在剩下的对象v[i+1]........v[n-1]中重复执行上述步骤,直到剩余对象只有一个为止。显然在这个过程中,具有相同关键码的对象可能会颠倒次序,因此直接选择排序算法是一种不...

小鲨鱼的博客 909

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

基础排序算法——冒泡排序、选择排序、插入排序、和改进的插入排序

概述:本次笔记整理了几个简单的排序算法,分别是冒泡排序,选择排序,插入排序,和改进的插入排序,简单描述了这几个排序算法的主要思想,且使用了C++代码进行实现。 目录 冒泡排序:BobbleSort 选择排序:SelectionSort 插入排序:InsertionSort 改进的插入排序:InsertionSort 冒泡排序:BobbleSort 时间复杂度: O(n^2) 算法...

WhiteCrowZHZ 210

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

简单排序算法(插入、选择、冒泡、希尔 )

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34383618的博客 170

python 冒泡、选择、插入、希尔排序算法

冒泡、选择、插入、希尔排序算法 冒泡排序: 冒泡排序的时间复杂度是O[n*n],是一种最简单的,最暴力的排序方法。它的工作原理是每次循环两两比较,将将大的值一次往后边放,最后完成升序排序。代码如下: def bubble_sort(nums): for i in range(len(nums) - 1): # 这个循环负责设置冒泡排序进行的次数(比如说n个数,则只要进行n-1次冒泡,就可...

iam_zhanghongliang的博客 214

冒泡排序、插入排序、选择排序、希尔排序

在计算机科学和数学中,一个排序算法(Sorting algorithm)是一种能将一串资料依照特定排序方式进行排列的一种算法。最常用到的排序方式是数值顺序以及字典顺序。有效的排序算法在一些算法(例如搜寻算法与合并算法)中是重要的,如此这些算法才能得到正确解答。排序算法也用在处理文字资料以及产生人类可读的输出结果。基本上,排序算法的输出必须遵守下列两个原则: 输出结果为递增序列(递增是针对所需的排...

csdn_dwk的博客 204

(一)冒泡排序,插入排序,选择排序

统一接口:template <class T> void sort(int lo, int hi) { switch (rand()%5) { case 1: BubbleSort(lo,hi); break; case 2: SelectSort(lo,hi) break; break;

ROOM 418

十大排序算法-冒泡排序&&选择排序&&插入排序(js基本实现&&改进)

1.基本思路分析 冒泡排序的过程,就是从第一个元素开始,**重复比较相邻的两个项**,若第一项比第二项更大,则**交换**两者的位置;反之不动。 2.复杂度分析 - **最好**时间复杂度:O(n) - **最坏**时间复杂度:O(n^2) - **平均**时间复杂度:O(n^2) 3.实现 4.改进-不做无差别比较 5.改进-最好情况O(n)

LYFlied的博客 362

排序总结:插入(简单和改进)、希尔、选择、冒泡、快速、堆排序、归并排序

插入:举出的、改进的、希尔 选择:基础的、堆排序 交换:冒泡、快排及其改进 归并:将两个已经排好序的文件归并成一个有序的大文件(比较适合链表)//基础的插入排序

Saray_的博客 632

选择排序、插入排序、冒泡排序python实现

选择排序的时间复杂度为O(n^2),是不稳定的排序 冒泡排序的时间复杂度最好情况下为O(n),最坏情况下为O(n^2),平均情况下为O(n^2),是稳定的排序 插入排序的时间复杂度最好情况下为O(n),最坏情况下为O(n^2),,平均情况下为O(n^2),是稳定的排序 1.选择排序 def selection(lista): leng=len(lista); for i in rang

零丁若叹 1720

3种简单的排序(冒泡,选择,排序)

这里写目录标题1.基础知识2.排序的引入方法一:选择排序方法二:冒泡排序冒泡排序的改进方法三:插入排序 1.基础知识 在学排序之前要先了解2个简单的算法 交换数组的2个位置的元素 void swap(int a[],int x,int y){//x和y是数组要要换位置的元素 int temp=a[x]; a[x]=a[y]; a[y]=temp; } 找出数组的最大(最小)元素的位置 int maxIndex(int a[],int n){ int k=0;//k用来标记数组最大元素的

m0_46381421的博客 354

排序数组 选择 冒泡 插入

void SelectIndexArray(int count ,int *array, int *indexs) { int minIndex = 0; for (int i = 0; i < count - 1; i++) { minIndex = i; for (int j = minIndex + 1; j < count; j++) {

筑雅浅缃的专栏 395

python 实现冒泡,选择,插入排序

使用python实现各种简单排序,对数字由大到小进行排序。 #sort number list str = raw_input('please input number list: > ') list = str.split(',') number = [] length = len(list) i=0 while(i<length): number.append(int(list[

kirrin的专栏 978

C++排序算法(冒泡,选择,直接插入,快速,希尔)

hush! show me your code! vs2013: #include&lt;iostream&gt; using namespace std; void printArr(int * arr,int n); void swap(int&amp; x, int &amp;y); void bubbleSort(int * arr, int n);//冒泡排序,从一端开始 vo...

newer_no1的博客 400

java 插入,冒泡,选择,快速,归并 等排序算法

package org.rut.util.algorithm.support; import org.rut.util.algorithm.SortUtil; /** * @author treeroot * @since 2006-2-2 * @version 1.0 */ public class InsertSort implements SortUtil.Sort...

java的天空 121
上一篇: WPS 5月19号 C++实习 笔试题回顾
下一篇: Mac下kernel_task进程cpu占用率久高不下解决记录
Findway_
博客等级 码龄10年 36粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值