java 折半插入排序_Java常见排序算法之折半插入排序

从今天开始,我们将要进行基本的排序算法的讲解。Are you ready?Let‘s go~~~

1、排序算法的基本概念的讲解

时间复杂度:需要排序的的关键字的比较次数和相应的移动的次数。

空间复杂度:分析需要多少辅助的内存。

稳定性:如果记录两个关键字的A和B它们的值相等,经过排序后它们相对的位置没有发生交换,那么我们称这个排序算法是稳定的。

否则我们称这个排序算法是不稳定的。

排序算法的常见分类:

1、内部排序(最常见的一种排序方式,不需要借助第三方辅助存储工具)

2、外部排序(需要借助外部存储来辅助完成相关的排序操作)

如果参与排序的数据元素非常的多,数据量非常的大,计算机无法把整个排序过程放到内存中进行的话,

我们必须借助外部存储器如磁盘来完成,这种排序方式,我们称之为外部排序。

其中外部排序最常见的就是多路归并排序,即将原始文件分解成多个能够一次性装入内存的部分,分别把每一部分调入

内存完成相应的排序,接下来在对多个有序的外部文件进行多路归并排序。

对于我们绝大多数的程序员而言,我们经常遇到的为内部排序。接下来我们将要对常见的内部排序进行相应的讲解。

今天要讲解的内部排序为:

折半插入排序

1.折半插入排序的基本概念的讲解

折半插入排序(binary insertion sort)是对插入排序算法的一种改进,由于排序算法过程中,就是不断的依次将元素插入前面已

排好序的序列中。由于前半部分为已排好序的数列,这样我们不用按顺序依次寻找插入点,可以采用折半查找的方法来加快寻找插入

点的速度。

在将一个新元素插入已排好序的数组的过程中,寻找插入点时,将待插入区域的首元素设置为a[low],末元素设置为a[high],则轮

比较时将待插入元素与a[m],其中m=(low+high)/2相比较,如果比参考元素小,则选择a[low]到a[m-1]为新的插入区域(即high=m-1),

否则选择a[m+1]到a[high]为新的插入区域(即low=m+1),如此直至low<=high不成立,即将此位置之后所有元素后移一位,

并将新元素插入a[high+1]。[

2.折半插入排序的Java代码实现

package com.yonyou.test;

/**

* 内部排序算法之折半插入排序

* 默认按照从小到大进行排序操作

* 需要注意的是在使用二分查找的时候,要求被查找的数列之前必须是有序的

* @author 小浩

* @创建日期 2015-3-27

*/

public class Test{

public static void main(String[] args) {

//需要进行排序的数组

int[] array=new int[]{8,3,2,1,7,4,6,5};

//输出原数组的内容

printResult(array);

//折半插入排序操作

binaryInsertSort(array);

//输出排序后的相关结果

printResult(array);

}

/**

* 折半插入排序的方法

* @param array

*/

private static void binaryInsertSort(int[] array) {

for(int i=1;i

{

int tempData=array[i];

int low=0;

int high=i-1;

while(low<=high)

{

int middle=(low+high)/2;

if(array[middle]

{

low=middle+1;

}

else

{

high=middle-1;

}

}

System.arraycopy(array,low,array,low+1,i-low);

array[low]=tempData;

}

}

/**

*

* 输出相应数组的结果

* @param array

*/

private static void printResult(int[] array) {

for(int value:array)

System.out.print(" "+value+" ");

System.out.println();

}

/**

* 交换数组中两个变量的值

* @param array

* @param i

* @param j

*/

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

int temp=array[i];

array[i]=array[j];

array[j]=temp;

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值