java 折半插入排序_折半插入排序 之通俗易懂,图文+代码详解-java编程

1.特点及概念介绍

下面给大家讲解一下"二分法查找"这个java基础查找算法,那么什么是二分法呢?其实所谓的"二分法",就是一分为二的意思,综合起来理解就是一分为二的查找,但大家记住了,二分法是建立在"已经按顺序排好"的基础条件上,如果大家把这个二分法查找理解清楚了,那么会有助于你更好的理解快速排序,下面我就罗列出该算法的特点:

1.定义起始位置start(0角标),定义末位置end(lenght-1位置,即最后一位)

2.无限循环的查找一个值,先看看该值是不是在中间mid角标,mid=(star+end)/2

3.如果该值大于mid角标对应值,那么start变成mid的右边一位,如果小于,那么end就变成mid的左边一位,这样会极其的高效.

5.找到值就返回值或打印,找不着也返回-1或打印,并停止循环.

6.在排序中关键字比较次数同记录初始排列无关的

2.图文描述过程

ad2de3eaef2527290385a2fc515d10e4.png

现有需求:

1.有一个已经排列好顺序的从小到大的数组.

2.请查询一个数字所在的角标位置.

3.如果元素不存在,请给出如果插入,那么应该插入的位置.

3.代码详情(参考 https://www.cnblogs.com/snowcan/p/6244361.html)

public class BinaryInsertSort {

public static void main(String[] args) {

// TODO Auto-generated method stub

int[] arr = {3,1,5,7,2,4,9,6};

new BinaryInsertSort().binaryInsertSort(arr);

}

/**

* 折半插入排序算法的实现

*/

public void binaryInsertSort(int[] arr){

int n=arr.length;

int i,j;

for (i=1;i

int temp=arr[i];

int low=0;

int high=i-1;

while (low<=high){

int mid=low+(high-low)/2;

if(temp>arr[mid]){

low=mid+1;

}else if(temp

high=mid-1;

}

}

for (j=i-1;j>=low;j--){

arr[j+1]=arr[j];

}

arr[low]=temp;

/**

* 打印每次循环的结果

*/

printProcess(arr,n,i);

}

/**

* 打印排序结果

*/

printResult(arr,n);

}

/**

* 打印排序的最终结果

* @param arr

* @param n

*/

private void printResult(int[] arr, int n) {

System.out.print("最终排序结果:");

for(int j=0;j

System.out.print(" "+arr[j]);

}

System.out.println();

}

/**

* 打印排序的每次循环的结果

* @param arr

* @param n

* @param i

*/

private void printProcess(int[] arr, int n, int i) {

System.out.print("第"+i+"次:");

for(int j=0;j

System.out.print(" "+arr[j]);

}

System.out.println();

}

}

运行结果:

第1次: 1 3 5 7 2 4 9 6

第2次: 1 3 5 7 2 4 9 6

第3次: 1 3 5 7 2 4 9 6

第4次: 1 2 3 5 7 4 9 6

第5次: 1 2 3 4 5 7 9 6

第6次: 1 2 3 4 5 7 9 6

第7次: 1 2 3 4 5 6 7 9

最终排序结果: 1 2 3 4 5 6 7 9

4.总结:

二分法查找,又称折半查找,大家需要记住的重点有

1.优点是比较次数少,查找速度快,平均性能好;

其缺点是要求待查表为有序表,且插入删除困难。

因此,折半查找方法适用于不经常变动而查找频繁的有序列表。它的算法要求是必须是顺序存储结构,必须有序排列2.确定最左边的start,最右边的end3.无限循环当中找mid角标对应的值,start和end会根据情况改变4.当发现start和end交叉,那么证明找不到,即如果放入该元素,那么就应该放在此时的start位置.

5.使用二分查找算法在一个有序序列中查找一个元素的时间复杂度为(logn )。

原因:折半查找,每次都是1/2,设寻找t次,等式为2t =n,n为数据的总数,倒过来就答案B。总共有n个元素,渐渐跟下去就是n,n/2,n/4,....n/2^k(接下来操作元素的剩余个数),其中k就是循环的次数,由于你n/2^k取整后>=1,即令n/2^k=1

6.设有序顺序表中有n个数据元素,则利用二分查找法查找数据元素X的最多比较次数不超过 log2n+1

因为二分查找每次排除掉一半的不适合值,所以对于n个元素的情况:

一次二分剩下:n/2

两次二分剩下:n/2/2 = n/4

......

m次二分剩下:n/(2^m)

在最坏情况下是在排除到只剩下最后一个值之后得到结果,所以为

n/(2^m)=1;

2^m=n;

此时时间复杂度为log2(n)

再与最后一个元素比较复杂度+1

所以时间复杂度为:log2(n)+1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值