当前位置:网站首页 > Java基础 > 正文

单向链表排序java(单链表排序 java)



单向链表 

 

  addFirst方法

 

遍历链表 

一 

 

二 

 

 三 

 

 Test类e

 

 

1.关于为什么在中间值不使用middle=(left+right)/2;

因为Java中使用 在Java中,进行二分查找时,直接使用  可能会遇到整数溢出的问题。这是因为当  和  都非常大且接近  时,它们的和可能会超过  类型的最大值,从而导致溢出。

 改进版

int middle = left + (right - left) / 2;

无符号右移一位相当于除以2向下取整 

那么 

int middle = left +right >>> 1; 

2.关于为什么使用left<=right去作为判断跳出循环的条件而不是去用left<right去作为判断的条件 

 如果使用 left < right 作为条件,那么在最后一次迭代中,当 left 和 right 相邻时(即 left = right - 1),循环就会提前终止,从而可能错过目标元素(如果它正好位于 left 或 right 指向的位置)。

 left ==right 意味着它们指向的元素也会参与比较,left < right  只意味着middle指向的元素参与比较

核心为将right不作为比较元素 

 

该写法的特点:

i,j 对应着搜索区间 [0,a.length)(注意是左闭右开的区间),i<j 意味着搜索区间内还有未比较的元素,j 指向的一定不是查找目标

思考:为啥这次不加 i==j 的条件了?

回答:这回 j 指向的不是查找目标,如果还加 i==j 条件,就意味着 j 指向的还会再次比较,找不到时,会死循环

1)令right为arr.length是确定right为数组边界外一值并不是数组中的值不希望right参与比较,在其中left是参加比较的值而right是不参与比较的值

使得在target在小于arr[middle]时令right=middle 

2)关于循环跳出条件为left<right的原因

当查找的数没有在数组中时会进行死循环报错

问题切入点:

l为总循环次数,当元素在最右边与最左边时的循环次数不一致。在最右边要进行2*l次比较

 

时间复杂度都为log(n)。 

 

核心为进行两分支(if else),比较一次,在循环中只是缩小范围不进行返回值 

注意判断循环条件为(left+1<right)

 

 

关于使用Java自身提供的区别在于返回值当查询不到数据时返回的是-(插入值+1) 

return -(low + 1);  // key not found. 

eg  当我的数组为{1,23,45,77,123}时我查找12时就会返回-2(因为12拍数组第二所以-(1+1)=-2)

 

返回-2 

实现查找重复数字中最左边序号  

 

实现查找重复数字中最右边序号  

区别:在边界处不同

// 继续向右搜索,直到找到最右边的位置  
            left = middle + 1;   

 

对于Leftmost与Rightmost,可以返回一个比-1更有用的值

Leftmost改为

 

  • Leftmost返回值的另一层含义:小于target的元素个数,≥target的最靠左索引
  • 小于等于中间值,都要向左找

 Rightmost改为

 

  • Rightmost返回值的另一层含义:≤target的最靠右索引
  • 大于等于中间值,都要向右找

范围查询

查询x<4,0...leftmost(4) - 1
查询x ≤ 4,0...rightmost(4)
查询4 < x,rightmost(4) + 1 ... infty
查询4 ≤ x,leftmost(4) ... infty
查询4 ≤ x ≤ 7,leftmost(4) ... rightmost(7)
查询4 < x < 7,rightmost(4) + 1 ... leftmost(7) - 1

求排名:leftmost(target) + 1


求前任:leftmost(target) - 1


求后任:rightmost(target) + 1

rightmost(5) + 1 = 5,后任a[5] = 7
rightmost(4) + 1 = 5,后任a[5] = 7
求最近邻居 

前任和后任距离更近者

 

 

 

到此这篇单向链表排序java(单链表排序 java)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • 学java比较好的网站(学java的平台)2024-12-18 19:45:08
  • java调用dll动态库代码(java调用dll 参数传递)2024-12-18 19:45:08
  • java字符串类型转换为int(java字符串转其他类型)2024-12-18 19:45:08
  • java面试题八股文面试(java面试八股文是哪些)2024-12-18 19:45:08
  • javajvm内存模型(jvm 的内存模型)2024-12-18 19:45:08
  • java爬虫步骤(java写爬虫程序)2024-12-18 19:45:08
  • java天气预报接口(java天气预报程序)2024-12-18 19:45:08
  • Java字符串转时间(java字符串转成时间)2024-12-18 19:45:08
  • java阻塞队列是线程安全的吗(java阻塞队列原理)2024-12-18 19:45:08
  • java八股文是什么意思(java八股文是啥)2024-12-18 19:45:08
  • 全屏图片