交换排序(冒泡排序和快速排序)

news2024/12/23 14:31:02

交换排序

冒泡排序

传统方法:

for (int i = 0; i < numsSize - 1; i++) {
    for (int j = 0; j < numsSize - 1 - i; j++) {
        if (nums[j] > nums[j + 1]) {
            Swap(&nums[j], &nums[j + 1]);
        }
    }
}

方法二:

while循环+for循环

int end = numsSize - 1;
while (end >= 0) {
    int flag = 0;
    for (int j = 0; j < end; j++) {
        if (nums[j] > nums[j + 1]) {
            Swap(&nums[j], &nums[j + 1]);
            flag = 1;
        }
    }
    if (flag == 0) break;
    --end;
}

快速排序

快排的核心是分治。

找到一个pivot.

左边比它小,有别比它大,一直递归,直到数组有序。

 找pivot有三种方法:

 

int PartSort1(int* nums, int left, int right) {
    
    int index = GetMidIndex(nums, left, right);
    Swap(&nums[left], &nums[right]);
    int begin = left, end = right;
    int pivot = begin;
    int key = nums[begin];

    while (begin < end) {
        //右边找小,放到左边
        while (begin < end && nums[end] >= key) {
            --end;
        }
        //小的放到左边的坑里,自己形成新的坑位
        nums[pivot] = nums[end];
        pivot = end;
        while (begin < end && nums[begin] <= key) {
            ++begin;
        }
        nums[pivot] = nums[begin];
        pivot = begin;
    }
    pivot = begin;
    nums[pivot] = key;
    return pivot;
}

 end找小,begin找大,找到之后调用交换函数,最后begin和end重合,执行Swap(&nums[begin], &nums[keyi]);

int PartSort2(int* nums, int left, int right) {
    int index = GetMidIndex(nums, left, right);
    Swap(&nums[left], &nums[right]);
    int begin = left, end = right;
    
    int keyi = nums[begin];
    while (begin < end) {
        //找小
        while (begin < end && nums[end] >= nums[keyi]) {
            --end;
        }
        //找大
        while (begin < end && nums[begin] <= nums[keyi]) {
            ++begin;
        }
        Swap(&nums[begin], &nums[end]);
    }
    Swap(&nums[begin], &nums[keyi]);
    return begin;

}

 

 

int PartSort3(int* nums, int left, int right) {
    int index = GetMidIndex(nums, left, right);
    Swap(&nums[left], &nums[index]);
    int keyi = left;
    int prev = left, cur = left + 1;
    while (cur <= right) {
        if (nums[cur] < nums[keyi]) {
            ++prev;
            Swap(&nums[prev], &nums[cur]);
        }
        ++cur;
    }
    Swap(&nums[prev], &nums[keyi]);
    return prev;
}

快排存在一种最坏的情况,及一串数有序时,左别没有比pivot那个位置小的数。

需要一直找。

时间复杂度将变为O(n*n)

故需要通过三数取中来排除最坏的情况。

int GetMidIndex(int* nums, int left,int right) {
    int mid = (left + right) >> 1;
    if (nums[left] < nums[mid]) {
        if (nums[mid] < nums[right]) {
            return mid;
        }
        else if (nums[left] > nums[right]) {
            return left;
        }
        else {
            return right;
        }
    }
    else {//nums[left] > nums[mid]
        if (nums[mid] < nums[right]) {
            return right;
        }
        else if (nums[left] < nums[right]) {
            return left;
        }
        else {
            return mid;
        }
    }

}
void QuickSort(int* nums, int left,int right) {
    if (left >= right) {
        return;
    }


    int keyIndex = PartSort3(nums, left, right);

    if (keyIndex - 1 - left > 10) {
        QuickSort(nums,left, keyIndex -1);
    }
    else {
        InsertSort(nums + left, keyIndex - 1 - left + 1);
    }
    if (right - (keyIndex + 1) > 10) {
        QuickSort(nums, keyIndex + 1, right);
    }
    else {
        InsertSort(nums + keyIndex + 1, right - (keyIndex + 1) + 1);
    }

}

数据量小与10时使用InsertSort可以提高效率、

if{

}

else{

}

的目的是为了小区间优化。

进一步提高效率。

2^10=1024.

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

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

相关文章

理解并实现OpenCV中的图像平滑技术

导读 图像模糊&#xff08;也称为图像平滑&#xff09;是计算机视觉和图像处理中的基本操作之一。模糊图像通常是噪声减少、边缘检测和特征提取等应用的第一步。在本博客中&#xff0c;我们将重点介绍如何使用Python中的OpenCV库应用多种模糊技术。 理论概述&#xff1a; 基本…

Netty中的内置通信模式、Bootstrap和ChannelInitializer

内置通信传输模式 NIO:io.netty.channel.socket.nio 使用java.nio.channels包作为基础–基于选择器的方式Epoll:io.netty.channel.epoll由JNI驱动的epoll()和非阻塞IO.这个传输支持只有在Linux上可用的多种特性&#xff0c;如果SO_REUSEPORT&#xff0c;比NIO传输更快&#xf…

视觉slam十四讲学习笔记(六)视觉里程计 1

本文关注基于特征点方式的视觉里程计算法。将介绍什么是特征点&#xff0c;如何提取和匹配特征点&#xff0c;以及如何根据配对的特征点估计相机运动。 目录 前言 一、特征点法 1 特征点 2 ORB 特征 FAST 关键点 BRIEF 描述子 3 特征匹配 二、实践&#xff1a;特征提取…

计算机网络——14CDN

CDN 视频流化服务和CDN&#xff1a;上下文 视频流量&#xff1a;占据着互连网大部分的带宽 Netflix&#xff0c;YouTube&#xff1a;占据37%&#xff0c;16%的下行流量 挑战&#xff1a;规模性-如何服务~1B用户&#xff1f; 单个超级服务器无法提供服务&#xff08;为什么&am…

第7章 Page442~446 7.8.9智能指针

指向堆内存的指针&#xff0c;很容易忘了释放&#xff1a; int foo() {int* p new int(9);cout << *p << endl;return *p; } 为什么要用指针 使用堆数据有以下几个目的&#xff08;也可称为作用&#xff09;如表7-18所列 表7-18 使用堆数据的常见目的 使用堆数…

阿里云服务器租用价格表(2024更新)

2024年最新阿里云服务器租用费用优惠价格表&#xff0c;轻量2核2G3M带宽轻量服务器一年61元&#xff0c;折合5元1个月&#xff0c;新老用户同享99元一年服务器&#xff0c;2核4G5M服务器ECS优惠价199元一年&#xff0c;2核4G4M轻量服务器165元一年&#xff0c;2核4G服务器30元3…

数据结构:4_二叉树

二叉树 一.树概念及结构 1. 树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 有一个**特殊的…

让你的资金运动起来,金钱的聪明处理方式

一、教程描述 本套教程主要讲解了金融思维和财务思维&#xff0c;常见投资工具的实操技巧&#xff0c;资产配置方案的制定方法&#xff0c;等等&#xff0c;将会重构你现有的投资观念&#xff0c;提升你认知的宽度和深度&#xff0c;可以轻松读懂财经新闻&#xff0c;不仅学会…

单片机学习笔记---LED呼吸灯直流电机调速

目录 LED呼吸灯 直流电机调速 模型结构 波形 定时器初始化函数 中断函数 主程序 上一节讲了电机的工作原理&#xff0c;这一节开始代码演示&#xff01; 我们上一篇说Ton的时间长Toff时间短电机会快&#xff0c;Ton的时间短Toff时间长电机会慢 并且我们还要保证无论Ton和…

红队ATKCK|红日靶场Write-Up(附下载链接)

网络拓扑图 下载地址 在线下载&#xff1a; http://vulnstack.qiyuanxuetang.net/vuln/detail/2/ 百度网盘 链接&#xff1a;https://pan.baidu.com/s/1nlAZAuvni3EefAy1SGiA-Q?pwdh1e5 提取码&#xff1a;h1e5 环境搭建 通过上述图片&#xff0c;web服务器vm1既能用于外…

【网络安全】什么样的人适合学?该怎么学?

有很多想要转行网络安全或者选择网络安全专业的人在进行决定之前一定会有的问题&#xff1a; 什么样的人适合学习网络安全&#xff1f;我适不适合学习网络安全&#xff1f; 当然&#xff0c;产生这样的疑惑并不奇怪&#xff0c;毕竟网络安全这个专业在2017年才调整为国家一级…

【BUUCTF 加固题】Ezsql 速通

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏 …

隐函数的求导【高数笔记】

1. 什么是隐函数&#xff1f; 2. 隐函数的做题步骤&#xff1f; 3. 隐函数中的复合函数求解法&#xff0c;与求导中复合函数求解法有什么不同&#xff1f; 4. 隐函数求导的过程中需要注意什么&#xff1f;

Day01 javaweb开发——tlias员工管理系统

任务介绍 完成部门管理和员工管理的增删改查功能 环境搭建 前端---->后端---->数据库 准备数据库表创建springboot工程&#xff08;web、mybatis、mysql驱动、lombok&#xff09;application.properties中引入mybatis配置信息&#xff0c;准备对应的实体类准备三层架…

Midjourney绘图欣赏系列(四)

Midjourney介绍 Midjourney 是生成式人工智能的一个很好的例子&#xff0c;它根据文本提示创建图像。它与 Dall-E 和 Stable Diffusion 一起成为最流行的 AI 艺术创作工具之一。与竞争对手不同&#xff0c;Midjourney 是自筹资金且闭源的&#xff0c;因此确切了解其幕后内容尚不…

深入理解lambda表达式

深入理解ASP.NET Core中的中间件和Lambda表达式 var builder WebApplication.CreateBuilder(args); var app builder.Build(); app.Use(async (context, next) > { // Add code before request. await next(context);// Add code after request.}); 这段C#代码是用于设…

Mac M2芯片配置PHP环境

Mac M2芯片配置PHP环境 1. XAMPP2. PHPBrew(PHP版本管理)安装php7.4.33版本 3. 直接使用homebrew 安装php环境参考 1. XAMPP 官网地址 https://www.apachefriends.org/ 安装 安装完成 web server打开后&#xff0c;在打开localhost 成功&#xff01; 2. PHPBrew(PHP版本管…

node+vue3+mysql前后分离开发范式——实现视频文件上传并渲染

文章目录 ⭐前言⭐ 功能设计与实现💖 node上传文件写入file_map映射表💖 vue3前端上传文件回显⭐ 效果⭐结束⭐前言 大家好,我是yma16,本文分享关于 node+vue3+mysql前后分离开发范式——实现视频文件上传并渲染。 技术选型 前端:vite+vue3+antd 后端:node koa 数据库…

Python asyncio高性能异步编程 详解

目录 一、协程 1.1、greenlet实现协程 1.2、yield关键字 1.3、asyncio 1.4、async & await关键字 二、协程意义 三、异步编程 3.1、事件循环 3.2、快速上手 3.3、await 3.4、Task对象 3.5、asyncio.Future对象 3.5、concurrent.futures.Future对象 3.7、异步…

python+django+vue汽车票在线预订系统58ip7

本课题使用Python语言进行开发。基于web,代码层面的操作主要在PyCharm中进行&#xff0c;将系统所使用到的表以及数据存储到MySQL数据库中 使用说明 使用Navicat或者其它工具&#xff0c;在mysql中创建对应名称的数据库&#xff0c;并导入项目的sql文件&#xff1b; 使用PyChar…