数据结构实验-折半插入排序-双向冒泡排序

news2024/11/15 6:51:28

目录

分析:

折半插入排序

双向冒泡排序

 折半插入排序

思想:

代码

运行结果

 双向冒泡排序

代码

运行结果


分析:

  • 折半插入排序

折半插入排序,折半插入排序是在直接插入的改进,通过折半查找得到插入位置,减少比较次数。

折半插入排序的基本思想是:设在数据表中有一个元素序列a[0],a[1],……,a[n-1]。其中,a[0],a[1],……,a[i-1]已经排好序。在插入a[1]时,利用折半查找法寻找a[i]的插入位置。

  • 双向冒泡排序

 传统冒泡算法原理

·冒泡排序算法的运作如下:(从后往前)

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 

    双向冒泡算法原理 

       ·双向冒泡排序算法的运作如下:

  1. 传统冒泡气泡排序的双向进行,先让气泡排序由左向右进行,再来让气泡排序由右往左进行,如此完成一次排序的动作
  2. 使用left与right两个旗标来记录左右两端已排序的元素位置。

一个排序的例子如下所示:

排序前:45 19 77 81 13 28 18 19 77 11

往右排序:19 45 77 13 28 18 19 77 11 [81]

向左排序:[11] 19 45 77 13 28 18 19 77 [81]

往右排序:[11] 19 45 13 28 18 19 [77 77 81]

向左排序:[11 13] 19 45 18 28 19 [77 77 81]

往右排序:[11 13] 19 18 28 19 [45 77 77 81]

向左排序:[11 13 18] 19 19 28 [45 77 77 81]

往右排序:[11 13 18] 19 19 [28 45 77 77 81]

向左排序:[11 13 18 19 19] [28 45 77 77 81]

如上所示,括号中表示左右两边已排序完成的部份,当left >= right时,则排序完成。 


 折半插入排序

  • 思想:

  1. 在排序第i个数时,前i-1个数已经排序完成,这是折中排序的前提,所以在开始排序时起始位置为i=1

  2. 折中排序,顾名思义就是折中,所以在折中排序时,先要以谁开头以谁结尾,所以需要定义两个变量front,end,有了这两个变量才能够找到他们的中间值mid

  3. 排序的最终目的还是找到i的最终插入位置,本代码要求升序排序,所以只需找到比下标为i的数小的数的下标

  4. 以此时只需将mid的值与i的值作比较,如果arr[i]<arr[mid]的话,此时说明下标为i的插入位置为[0,mid-1]所以end的位置,应该为mid-1,依次类推,反之则front的位置为mid+1

  5. 当front值大于end值的时候则此时说明找到了下标为i的数的插入位置,位置为front

  6. 找到插入位置后只需将i-1到front的数向后移动一位,则此时front的位置空出来之后,将下标为i的值插入就完成了排序

  • 代码

#include<iostream>
using namespace std;

void binaryInsertSort(int a[],int len) {
	int front, end,temp;
	for (int i = 1; i < len; i++) {
		temp = a[i];
		front = 0;
		end = i - 1;
		while (front<=end)
		{
			int mid;
			mid = (front + end) / 2;
			if (temp < a[mid]) {
				end = mid - 1;
			}
			else {
				front = mid + 1;
			}
		}
		for (int j = i; j > front; j--) {
			a[j] = a[j - 1];
		}
		a[front] = temp;
	}
	//排序
	cout << "从小到大排序为:";
	for (int k = 0; k < len; k++) {
		cout << a[k] << "\t";
	}
	cout << endl;
}
int main() {
	int arr[10];
	cout << "请输入10个数:" << endl;
	for (int i = 0; i < 10; i++) {
		cin >> arr[i];
	}

	cout << "这10个数为:";
	for (int i = 0; i < 10;i++) {
		cout << arr[i] << "\t";
	}
	cout << endl;

	//折半排序
	binaryInsertSort(arr,10);
	system("pause");
	return 0;
}
  • 运行结果


 

 双向冒泡排序

  • 代码

#include <iostream>
using namespace std;

void bubbleSort(int a[], int n) {
    int left = 0, right = n - 1;
    while (left < right) {
        int flag = 0;
        // 从左到右选最大的值
        for (int j = left; j < right; ++j) {
            if (a[j] > a[j + 1]) {
                swap(a[j], a[j + 1]);
                flag = 1;
            }
        }
        // 从右到左选最小的值
        --right;
        for (int m = right; m > left; --m) {
            if (a[m] < a[m - 1]) {
                swap(a[m], a[m - 1]);
                flag = 1;
            }
        }
        ++left;
        if (!flag) {
            break;
        }
    }
    cout << "双向冒泡排序为:";
    for (int i = 0; i < n;i++) {
        cout << a[i] << "\t";
    }
    cout << endl;
}

int main() {

    int arr[] = { 8, -1, 0, 6, -2, 1, 7, 9, 0, 2, 5, 4, 3 };
    int len = sizeof(arr) / sizeof(arr[0]);

    cout << "这组数为:\t";
    for (int i = 0; i < len; i++) {
        cout << arr[i] << "\t";
    }
    cout << endl;
    cout << endl;
    //双向冒泡排序
    bubbleSort(arr, len);
    /*for (const int& temp : arr) {
        cout << temp << " ";
    }*/
    cout << endl;
    return 0;
}
  • 运行结果

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/69503.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java自定义类加载器来加载本地class文件,用demo来解析类加载的双亲委派机制、沙箱机制、打破双亲委派机制

1、首先将class文件放入指定本地目录下 2、编写自定义类加载器demo代码来加载class文件 /*** author WuSong* version 1.0* date 2022/12/7 12:07* description*/ public class MyClassLoaderTest {/*** 1&#xff1a;继承ClassLoader类* 2&#xff1a;重写findClass方法*/sta…

2023最新扫码连wifi-扫码挪车-聚合CPS返利多合一小程序源码

2023最新扫码连wifi-扫码挪车-聚合CPS返利多合一系统 系统特点: 目前已接入的 CPS 渠道: 充值:话费充值、电费充值、影视会员充值、会员卡券充值 本地团购:联联周边游 电商平台:京东、拼多多、唯品会、淘宝、抖音美团:外卖、闪购、酒店、到店、优选饿了么:外卖、商超 出行服务:…

高压放大器在压电驱动器的机翼除冰方法研究中的应用

实验名称&#xff1a;高压放大器基于压电驱动器的机翼除冰方法研究 研究方向&#xff1a;压电效应、多普勒激光测振 实验原理&#xff1a;多普勒激光测振仪是基于多普勒激光测振原理工作的&#xff0c;当四边固支的矩形板通过驱动器激振起来时&#xff0c;通过激光扫描铝板上的…

知识图谱-KGE-语义匹配-双线性模型(打分函数用到了双线性函数)-2012:LFM(Latent Factor Model)

【paper】 A latent factor model for highly multi-relational data 【简介】 这篇文章是法国的研究团队发表在 NIPS 2012 上的文章&#xff0c;还挂了 Antoine Bordes 的名字。文章提出了 LFM&#xff08;Latent Factor Model&#xff09;&#xff0c;主要贡献有两点&#x…

机床测头应用一:仿形加工功能,降低废品率

机床测头是一种可安装在大多数数控机床上&#xff0c;并在加工循环中自动对工件的尺寸及位置进行测量的装置&#xff0c;使用合适的测量程序&#xff0c;还可以根据测量结果实现自动刀路补偿&#xff0c;可以保证“第一件和第一百件尺寸一致”&#xff0c;是批量生产中不可缺少…

PLC程序实例三:ModBusRTU客户端编程实例与测试方法

一、需求描述 1、设备作为ModBusRTU服务端时&#xff0c;需要给出对应的测试方法&#xff0c;即 PLC 作为主站&#xff0c;设备作为从站使用&#xff08;本文编写的是PLC主站程序&#xff09; 2、业务与上一篇文章ModBusTCP网络触发业务逻辑一致&#xff0c;描述如下&#xf…

SpringCloud学习笔记 - Nacos服务注册中心 - Nacos Discovery

1. Nacos简介 Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称&#xff0c;一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集&#xff0c;帮助您…

Git实战 | 让工作更高效,搞定Git的分支管理

上一篇讲到Git的分支管理实操&#xff0c;在线合并和本地合并都进行了实操。毕竟&#xff1a;光说不练是假把式。而只练不整理&#xff0c;只能是傻把式了。分支管理到底如何进行管理呢&#xff1f; 先以GitLab上的一张经典的图打头&#xff0c;作为一个总体概览&#xff0c;也…

汇编语言程序设计期末复习

汇编期末复习 第一章 汇编语言基础知识 机器指令&#xff1a;cpu能直接识别并遵照执行的指令&#xff0c;用二进制编码表示&#xff0c;由操作码&#xff0c;操作数组成&#xff0c;编码只含二进制0或1 机器语言&#xff1a;用二进制编码组成的机器指令的集合和一组使用机器…

java swing(GUI) MySQL实现的视频播放器系统源码+运行教程

今天给大家演示一下由Java swing实现的一款简单的多媒体播放器&#xff0c;项目源码我会放在我的网站上&#xff0c;并配有视频配置教程&#xff0c;保证运行起来的。这个小播放器实现了视频、音频文件的播放、暂停、快进、快退、停止、全屏等功能&#xff0c;还有历史记录功能…

Nacos学习

Nacos NacosNacosNacos 简介核心特性&#xff1a;Nacos 启动启动运行(windows)standalone&#xff08;单节点&#xff09;cluster模式Nacos Server 的配置数据是存在哪里呢&#xff1f;测试demo项目结构统一配置中心命名空间、分组、文件新建bootstrap.properties文件依赖contr…

字符串相似及匹配 Jaro-Winkler

前言 String str1 "明天吃红烧肉"; String str2 "明天中午吃红烧肉"; String str3 "明天吃红烧肉&#xff1f;"; String str4 "吃红烧肉";用普通的相等判断&#xff0c;只能得到是或否&#xff0c;但如果你在实际的业务需求中&am…

【中国信通院|低代码·无代码应用沙龙】低代码平台在云智慧的实践探索

从2014年 Forrester Research 首次提出“低代码开发平台&#xff08;LCAP&#xff09;”这一概念开始&#xff0c;低代码行业便备受关注。随着 SaaS 场景的加持&#xff0c;aPaaS 场景也被孵化了出来。与此同时&#xff0c;随着近两年 Outsystems 的快速发展&#xff0c;让其成…

猜数字-第11届蓝桥杯Scratch选拔赛真题精选

[导读]&#xff1a;超平老师计划推出Scratch蓝桥杯真题解析100讲&#xff0c;这是超平老师解读Scratch蓝桥真题系列的第97讲。 蓝桥杯选拔赛每一届都要举行4~5次&#xff0c;和省赛、国赛相比&#xff0c;题目要简单不少&#xff0c;再加上篇幅有限&#xff0c;因此我精挑细选…

【Unity】Entities 1.0 学习(二):调试工具

在 Entites 1.0 &#xff0c;Unity修改了之前的调试面板&#xff0c;以及在场景下构建 Ecs World 的流程&#xff0c;较之前的版本差别还是蛮大的。 之前的学习大多集中在代码和语法&#xff0c;很多是对之前成熟的代码做升级改造&#xff0c;所以没有用到新的调试工具。但是最…

Java以Graph方式发送Outlook、Exchange邮件(2022新版)

目录 问题提出 问解决题 注意 1、注册应用程序 2、引入需要依赖jar包——重点 3、微软管理员授予应用合适权限 参考链接 问题提出 在2022年10月份&#xff0c;微软公司出于安全考虑&#xff0c;陆续取消了Exchange邮件发送的Basic认证。通俗来说就是不能再用用户名密码…

ModuleNotFoundError: No module named ‘System‘解决办法

本人在做python和halcon接口的时候发现程序需要System库&#xff0c;报下面的错误 Traceback (most recent call last): File "D:/Project/pyhalcon/pcbhalcon.py", line 2, in <module> import System ModuleNotFoundError: No module named System Process …

APP隐私合规现状与防范措施

背景 2021年11月1《个人信息保护法》正式施行&#xff0c;标志信息保护进入强监管时代&#xff0c;APP监管被提升到前所未有的高度&#xff0c;数据安全、用户隐私、甚至功能体验等各个方面都出台了相应的规则规范&#xff0c;监管的初衷是&#xff1a;从各个层面保障用户的权…

Stimulsoft Reports.JAVA 2022.4.5 Crack

Stimulsoft Reports.JAVA Java 报表工具 Stimulsoft Reports.JAVA 是一种报告工具&#xff0c;用于在您的 Java 应用程序中进行业务报告的交互和工作。它包含 Java 和 HTML5 组件&#xff0c;允许您在不同平台、不同操作系统和不同硬件上使用创建的程序。因此&#xff0c;我们的…

树上的小兔子,藏了服务的新逻辑

【潮汐商业评论/原创】 自从一连三日委托会务组组织会议&#xff0c;Shirley在雅琳那收获了一个熟悉的称呼&#xff1a;雪梨&#xff0c;这是Shirley在部门内的“代号”&#xff0c;在过去独属于她最亲密的几位同事。 熟悉的称呼让她们感觉既轻松又亲近。然而&#xff0c;跳出…