当前位置:网站首页>【21天学习挑战赛】折半插入排序
【21天学习挑战赛】折半插入排序
2022-08-11 00:26:00 【小卢要刷力扣题】
活动地址:CSDN21天学习挑战赛
插入排序
插入排序的基本思路是每次插入一个元素,每一趟完成对一 个待排元素的放置,直到全部插入完成。
简单来说就是把小的数插入到大的数之前,从而把整个数组排好序
拿个简单的例子就是打扑克
只要打过扑克牌的都会对插入排序有一定的了解
排序扑克牌就是把小的牌一个个插入到大的牌前面
代码
public static void insertionSort(int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
// 不只1个数
for (int i = 1; i < arr.length; i++) {
// 0 ~ i 做到有序
for (int j = i - 1; j >= 0 && arr[j] > arr[j + 1]; j--) {
swap(arr, j, j + 1);
}
}
}
public static void swap(int[] arr, int i, int j) {
arr[i] = arr[i] ^ arr[j];
arr[j] = arr[i] ^ arr[j];
arr[i] = arr[i] ^ arr[j];
}
折半插入排序
折半插入排序就是在插入排序的基础上进行折半查找,来快速定位到要插入的位置
low到height代表有序区的范围,min代表无序区里的最小数
第一次遍历,有序区为[0,0],min=1;
将1插入到有序区内
有序区扩大一位
通过二分查找,我们可以确定比2小的数的最右位置
1后面即为2要插入的位置
到6了,
同过二分查找,我们可以快速的确定要插入到5的后面,
之后就按照以上的步骤,把整个数组排好
时间复杂度
如果输入的元素刚好是反向有序的,那么每次都需要进行位置的查找,但是在查找的次数要少一些。 可以知道,由于区间每次缩小一半,
可以得到寻找位置的次数最多为log2 i量级,但是由于移动元素的次数没变,时间复杂度依然是0(n2)。
代码
public class BinaryInsert {
public static void main(String[] args) {
// input data
int[] a = {
11,34,20,10,12,35,41,32,43,14};
// 数组下标从0开始,j初始为1,指向第二个元素
for (int i = 1;i < a.length;i++){
if (a[i] < a[i - 1]){
// 使用temp记录当前元素的值
int tmp = a[i];
// 初始化变量
int left = 0;
int right = i - 1;
// while循环作用:使用二分查找确定元素位置,并串出对应的位置
while(left <= right){
// 取中间元素,以下写法防止数据量较大时发生溢出
int mid = (right - left) / 2 + left;
if(a[mid] > tmp){
// 待排元素较小,将搜索区间缩小至左一半
right = mid - 1;
}else {
// 待排元素较大,将搜索区间缩小至右一半
left = mid + 1;
}
}
// 将待排元素放在对应的位置
for (int j = i - 1;j >= right + 1;j--){
a[j + 1] = a[j];
}
a[right + 1] = tmp;
}
}
// 查看排序结果
for (int data : a){
System.out.print(data + "\t");
}
}
}
边栏推荐
- 91.(cesium之家)cesium火箭发射模拟
- 报错:Client does not support authentication protocol requested by server; consider upgrading MySQL cli
- 如何利用原生JS实现回到顶部以及吸顶效果
- Qt入门(六)——抽奖系统的实现
- input输入框超出部分用省略号表示以及判断内容是否有超出(PC端)
- YOLOv5的Tricks | 【Trick10】从PyTorch Hub加载YOLOv5
- Only lazy and hungry. You still don't understand the singleton pattern!
- Mysql. Slow Sql
- web 性能提升(将持续更新……)
- 【pypdf2】合并PDF、旋转、缩放、裁剪、加密解密、添加水印
猜你喜欢
学习Apache ShardingSphere解析器源码(一)
【C语言】探索数据的存储(整形篇)
详解JDBC的实现与优化(万字详解)
Jvm.分析工具(jconsole,jvisualvm,arthas,jprofiler,mat)
微信小程序通过URL Scheme动态的渲染数据
Kunpeng compilation and debugging and basic knowledge of native development tools
IEEE的论文哪里可以下载?
虚拟电厂可视化大屏,深挖痛点精准减碳
使用 BeanUtils 做属性拷贝,性能有点拉胯!
"NIO Cup" 2022 Nioke Summer Multi-School Training Camp 2 DGHJKL Problem Solution
随机推荐
【openpyxl】只读模式、只写模式
Navicat 16-数据库工具
深度解析volatile关键字(保证够全面)
Part of the reserve bank is out of date
7. yaml
I caught a 10-year-old Ali test developer, and after talking about it, I made a lot of money...
YOLOv5的Tricks | 【Trick12】YOLOv5使用的数据增强方法汇总
复制带随机指针的链表——LeetCode
百战RHCE(第四十八战:运维工程师必会技-Ansible学习3-构建Ansible清单)
HW-常见攻击方式和漏洞原理(2)
[Excel知识技能] 将文本型数字转换为数值格式
Software protection scenario of NOR FLASH flash memory chip ID application
微信小程序强制更新版本
CF1286E-Fedya the Potter Strikes Back【KMP,RMQ】
只会懒汉式和饿汉式 你还不懂单例模式!
EN 12467纤维水泥平板产品—CE认证
WebView2 通过 PuppeteerSharp 实现RPA获取壁纸 (案例版)
9. Rest 风格请求处理
Ali P7 bask in January payroll: hard to fill the, really sweet...
Special class and type conversion