排序算法基本原理及实现2

news2024/11/19 7:31:45

                                                                                             

                                   📑打牌 : da pai ge的个人主页
                                   🌤️个人专栏 : da pai ge的博客专栏
                                  ☁️宝剑锋从磨砺出,梅花香自苦寒来

🌤️冒泡排序

🌤️原理

在无序区间,通过相邻数的比较,将最大的数冒泡到无序区间的最后,持续这个过程,直到数组整体有序

private void swap(int[] array, int i, int j) {

   int t = array[i];

   array[i] = array[j];

   array[j] = t;

}

private void createHeap(int[] array) {

   for (int i = (array.length - 1) / 2; i >= 0; i--) {

       shiftDown(array, array.length, i);

  }

}

public static void shiftDown(int[] array, int size, int index) {

   int left = 2 * index + 1;

   while (left < size) {

       int max = left;

  int right = 2 * index + 2;

       if (right < size) {

           if (array[right] > array[left]) {

               max = right;

          }

      }

       

       if (array[index] >= array[max]) {

           break;

      }

       

       int t = array[index];

       array[index] = array[max];

       array[max] = t;

       

       index = max;

       left = 2 * index + 1;

  }

}

时间复杂度

空间复杂度

最好O(n)

平均O(n^2)

最坏O(n^2)

数据有序数据逆序

🌤️实现

public static void bubbleSort(int[] array) {

for (int i = 0; i < array.length - 1; i++) {

boolean isSorted = true;

for (int j = 0; j < array.length - i - 1; j++) {

// 相等不交换,保证稳定性

if (array[j] > array[j + 1]) {

swap(array, j, j + 1);

isSorted = false;

}

}

if (isSorted) {

break;

}

}

}

🌤️快速排序

🌤️原理-总览

1. 从待排序区间选择一个数,作为基准值(pivot);

2. Partition: 遍历整个待排序区间,将比基准值小的(可以包含相等的)放到基准值的左边,将比基准值大的(可

以包含相等的)放到基准值的右边;

3. 采用分治思想,对左右两个小区间按照同样的方式处理,直到小区间的长度 == 1,代表已经有序,或者小区间

的长度 == 0,代表没有数据。

实现:

public static void quickSort(int[] array) {

quickSortInternal(array, 0, array.length - 1);

}

// [left, right] 为待排序区间

private static void quickSortInternal(int[] array, int left, int right) {

if (left == right) {

return;

}

if (left > right) {

return;

}

// 最简单的选择基准值的方式,选择 array[left] 作为基准值

// pivotIndex 代表基准值最终停留的下标

int pivotIndex = partition(array, left, right);

// [left, pivotIndex - 1] 都是小于等于基准值的

// [pivotIndex + 1, right] 都是大于等于基准值的

quickSortInternal(array, left, pivotIndex - 1);

quickSortInternal(array, pivotIndex + 1, right);

}

🌤️原理-partition

Hoare :

实现:

private static int partition(int[] array, int left, int right) {

int i = left;

int j = right;

int pivot = array[left];

while (i < j) {

while (i < j && array[j] >= pivot) {

j--;

}



while (i < j && array[i] <= pivot) {

i++;

}



swap(array, i, j);

}

swap(array, i, left);

return i;

}

挖坑

基本思路和Hoare 法一致,只是不再进行交换,而是进行赋值(填坑+挖坑)

实现:

前后遍历法:

private static int partition(int[] array, int left, int right) {

int d = left + 1;

int pivot = array[left];

for (int i = left + 1; i <= right; i++) {

if (array[i] < pivot) {

swap(array, i, d);

d++;

}

}

swap(array, d, left);



return d;

}

🌤️性能分析

时间复杂度

空间复杂度

最好 平均O(n * log(n))

最坏 最好O(n * log(n))

平均 最坏O(n^2) O(log(n)) O(log(n)) O(n)

稳定性:不稳定

🌤️原理-基准值的选择

1. 选择边上(左或者右)

2. 随机选择

3. 几数取中(例如三数取中):array[left], array[mid], array[right] 大小是中间的为基准值

🌤️原理-非递归分治

public static void quickSort(int[] array) {

Stack<Integer> stack = new Stack<>();

stack.push(array.length - 1);

stack.push(0);



while (!stack.isEmpty()) {

int left = stack.pop();

int right = stack.pop();

if (left >= right) {

continue;

}



int pivotIndex = partition(array, left, right);

stack.push(right);

stack.push(pivotIndex + 1);



stack.push(pivotIndex - 1);

stack.push(left);

}

}

🌤️优化总结

1. 选择基准值很重要,通常使用几数取中法

2. partition 过程中把和基准值相等的数也选择出来

3. 待排序区间小于一个阈值时(例如 48),使用直接插入排序

🌤️总结

1. 在待排序区间选择一个基准值

1. 选择左边或者右边

2. 随机选取

3. 几数取中法

2. 做 partition,使得小的数在左,大的数在右

1. hoare

2. 挖坑

3. 前后遍历

4. 将基准值相等的也选择出来(了解)

3. 分治处理左右两个小区间,直到小区间数目小于一个阈值,使用插入排序

🌤️归并排序

🌤️原理-总览

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and

Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子

序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

🌤️原理-合并两个有序数组

private static void merge(int[] array, int low, int mid, int high) {

int i = low;

int j = mid;

int length = high - low;

int[] extra = new int[length];

int k = 0;



// 选择小的放入 extra

while (i < mid && j < high) {

// 加入等于,保证稳定性

if (array[i] <= array[j]) {

extra[k++] = array[i++];

} else {

extra[k++] = array[j++];

}

}



// 将属于元素放入 extra

while (i < mid) {

extra[k++] = array[i++];

}



while (j < right) {

extra[k++] = array[j++];

}

时间复杂度

空间复杂度

O(n * log(n))

O(n)

数据不敏感

数据不敏感

// 从 extra 搬移回 array

for (int t = 0; t < length; t++) {

// 需要搬移回原位置,从 low 开始

array[low + t] = extra[t];

}

}

🌤️实现

public static void mergeSort(int[] array) {

mergeSortInternal(array, 0, array.length);

}

// 待排序区间为 [low, high)

private static void mergeSortInternal(int[] array, int low, int high) {

if (low - 1 >= high) {

return;

}



int mid = (low + high) / 2;

mergeSortInternal(array, low, mid);

mergeSortInternal(array, mid, high);



merge(array, low, mid, high);

}

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

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

相关文章

37 - 数据库参数设置优化,失之毫厘差之千里

MySQL 是一个灵活性比较强的数据库系统&#xff0c;提供了很多可配置参数&#xff0c;便于我们根据应用和服务器硬件来做定制化数据库服务。如果现在让你回想&#xff0c;你可能觉得在开发的过程中很少去调整 MySQL 的配置参数&#xff0c;但我今天想说的是我们很有必要去深入了…

CONTROLLING VISION-LANGUAGE MODELS FOR MULTI-TASK IMAGE RESTORATION

CONTROLLING VISION-LANGUAGE MODELS FOR MULTI-TASK IMAGE RESTORATION (Paper reading) Ziwei Luo, Uppsala University, ICLR under review(6663), Cited:None, Stars: 350, Code, Paper. 1. 前言 像CLIP这样的视觉语言模型已经显示出对零样本或无标签预测的各种下游任务…

血的教训--kail系统免密centos7的坑【高版本ssh免密低版本ssh的坑】

血的教训–kail系统免密centos7的坑【高版本ssh免密低版本ssh的坑】 最近下载了一个2023版本的kail系统&#xff0c;但是经过几次设置免密后&#xff0c;ssh过去一直让提供密码&#xff0c;所以就仔细的分析了一下&#xff0c;果然还是发现了点猫腻 接上一个博客&#xff0c;大…

TZOJ 1373 求多项式的和

答案&#xff1a; #include <stdio.h> int main() {int m 0;scanf("%d", &m); // 读取测试实例的个数 while (m--) //循环m次{int n 0, i 0;scanf("%d", &n); // 读取求和项数n double sum 0.0;for (i 1; i < n; i) //分…

项目demo —— GPT 聊天机器人

本文介绍我的开源项目 TelegramChatBot&#xff0c;这是一个基于 OpenAI GPT API 开发的 telegram 机器人&#xff0c;具有多模态交互能力&#xff0c;求 star&#xff01;感谢大家&#xff01;在 telegram jokerController_bot 立即体验&#xff01;欢迎对 GPT 应用开发或对 t…

Web安全漏洞分析-XSS(下)

随着互联网的迅猛发展&#xff0c;Web应用的普及程度也愈发广泛。然而&#xff0c;随之而来的是各种安全威胁的不断涌现&#xff0c;其中最为常见而危险的之一就是跨站脚本攻击&#xff08;Cross-Site Scripting&#xff0c;简称XSS&#xff09;。XSS攻击一直以来都是Web安全领…

【Python】yaml.safe_load()函数详解和示例

在Python中&#xff0c;PyYAML库提供了对YAML&#xff08;YAML Ain’t Markup Language&#xff09;文件的强大支持。YAML是一种直观的数据序列化标准&#xff0c;可以方便地存储和加载配置文件、数据日志等。 yaml.safe_load和yaml.load是Python的PyYAML库提供的两个函数&…

Node.js案例 - 记账本

目录 项目效果 项目的搭建 ​编辑 响应静态网页 ​编辑 ​编辑 结合MongoDB数据库 结合API接口 进行会话控制 项目效果 该案例实现账单的添加删除查看&#xff0c;用户的登录注册。功能比较简单&#xff0c;但是案例主要是使用前段时间学习的知识进行实现的&#xff0c…

Java后端开发——SpringMVC商品管理程序

Java后端开发——SpringMVC商品管理程序 今日目标 Spring MVC框架介绍掌握SpringMVC的核心类的原理及配置掌握SpringMVC的常用注解掌握SpringMVC的增删改查编程 Spring MVC框架介绍 Spring MVC&#xff08;Model-View-Controller&#xff09;是一个基于Java的开源框架&#x…

移动开发新风向?HarmonyOS、车载、音视频、flutter

目前&#xff0c;移动开发已经处于饱和的阶段&#xff0c;Android开发也不如当年盛况&#xff0c;已经不再像前几年前那么火爆。正如一种编程语言如果经历过盛极一时&#xff0c;那么必然有这样的一条曲线&#xff0c;像我们学的正弦曲线先急速上升&#xff0c;然后到达顶点&am…

拼图 游戏

运行出的游戏界面如下&#xff1a;按住A不松开&#xff0c;显示完整图片&#xff1b;松开A显示随机打乱的图片 User类 package domain;/*** ClassName: User* Author: Kox* Data: 2023/2/2* Sketch:*/ public class User {private String username;private String password;p…

服务器数据恢复—V7000存储raid5崩溃导致上层卷无法使用的数据恢复案例

服务器数据恢复环境&#xff1a; 某品牌V7000存储中有一组由几十块硬盘组建的raid5阵列。上层操作系统为windows server&#xff0c;NTFS分区。 服务器故障&#xff1a; 有一块硬盘出现故障离线&#xff0c;热备盘自动上线替换离线硬盘。在热备盘上线同步数据的过程&#xff0c…

WordPress 外链跳转插件

WordPress 外链跳转插件是本站开发的一款WordPress插件&#xff0c;能对文中外链添加一层过滤&#xff0c;有效防止追踪&#xff0c;以及提醒用户。 类似于知乎、CSDN打开其他链接的提示。 后台可以设置白名单 学习资料源代码&#xff1a;百度网盘 密码&#xff1a;123

低功耗蓝牙模块在运动健身追踪中的革新应用

随着健康和健身意识的不断提升&#xff0c;人们对运动追踪技术的需求日益增加。低功耗蓝牙模块的引入为运动健身追踪领域带来了新的可能性。本文将探讨低功耗蓝牙模块在运动健身追踪中的创新应用&#xff0c;重点关注其在设备连接性、数据传输和用户体验方面的优势。 随着科技的…

上海亚商投顾:沪指震荡下跌 成交量继续下破8000亿

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日震荡调整&#xff0c;深成指、创业板指午后跌超1%&#xff0c;北证50指数跌超7%&#xff0c;超百只北…

基于web宠颐生宠物医院系统设计与实现

基于web宠颐生医院系统开发与实现 摘要&#xff1a;时代飞速发展&#xff0c;网络也飞速发展&#xff0c;互联网许多的行业都可以用互联网实现了&#xff0c;互联网已经成为了人们生活中重要的一部分&#xff0c;或多或少的影响着我们的生活&#xff0c;互联网在给我带了方便的…

【洛谷算法题】P5716-月份天数【入门2分支结构】

&#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5716-月份天数【入门2分支结构】&#x1f30f;题目描述&#x1f30f;输入格式&a…

安卓apk抓包

起因 手机&#xff08;模拟器&#xff09;有时候抓不到apk的包&#xff0c;需要借助Postern设置一个代理&#xff0c;把模拟器的流量代理到物理机的burp上。 解决方案 使用Postern代理&#xff0c;把apk的流量代理到burp。 Postern是一个用于代理和网络流量路由的工具&#xf…

【Openstack Train安装】二、NTP安装

网络时间协议&#xff1a;Network Time Protocol&#xff08;NTP&#xff09;是用来使计算机时间同步化的一种协议&#xff0c;它可以使计算机对其服务器或时钟源&#xff08;如石英钟&#xff0c;GPS等等)做同步化&#xff0c;它可以提供高精准度的时间校正&#xff08;LAN上与…

MySQL中的JOIN与IN:性能对比与最佳实践

文章目录 JOIN与IN的基本介绍JOININ JOIN与IN性能对比使用JOIN的查询使用IN的查询 何时使用JOIN何时使用IN性能优化的其他考虑因素总结 &#x1f389;MySQL中的JOIN与IN&#xff1a;性能对比与最佳实践 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈…