`
TimerBin
  • 浏览: 361996 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

二分插入法

    博客分类:
  • JAVA
阅读更多

二分插入法每次看都无法一次理解清楚,在这里做一次笔记加深下印象。

一、Java代码如下所示:

 

public static void main(String[] args) {
		int [] values = new int[]{3,8,7,6,1,9,12,2,5,11};
		for(int i = 0 ; i < values.length ; i++){
			System.err.print(values[i] + ",");
		}
		System.err.println();
		sort(values);
		System.err.println();
		for(int i = 0 ; i< values.length; i++){
			System.err.print(values[i] + ",");
		}
	}
	public static void sort(int []  values){
		for(int i = 0 ;i < values.length ; i++)       //步骤1
			int now =  values[i];
			int left = 0;
			int right = i -1;
			int center = 0;
			while(left <= right){                //步骤2
				center = (left + right)/2;
				if(now < values[center]){    //步骤2.1
					right = center -1;
				}else{                       //步骤2.2
					 left = center + 1;
				}
			}
			for(int j = i-1 ;j >= left ; j--){   //步骤4  4.1  4.2
				 values[j+1] = values[j];
			}
			if(left != i){                       //步骤5 5.1  5.2
				 values[left] = now;
			}
		}
	}

 输出结果:

 

 

3,8,7,6,1,9,12,2,5,11,

1,2,3,5,6,7,8,9,11,12,

 

二、简单举例说一下当I=4时代码执行过程 ,详细过程如下图所示:

 

在i = 0、1、2、3执行完以后,values的顺序就变成如下列表:

        3, 6, 7, 8, 1, 9, 12, 2, 5, 11

 

此时当i=4初进循环时:

         now = 1 ; left = 0 ; right = 3 ; center = 0;

 

left (1) <= right (3) 进入while循环:

        center(1) = (left(0) + right(3))/2;

 

now(1) < values[center] (6)进入if:

       right(2) = right(3) - 1;

 

left (1) <= right (2)进入while循环:

       center(1) = (left(0) + right(2))/2;

 

now(1) < values[center] (6)进入if:

      right(1) = right(2) - 1;

 

left (1) <= right (1)进入while循环:

       center(0) = (left(0) + right(1))/2;

 

now(1) < values[center] (3)进入if:

        right(0) = right(1) - 1;

 

left (0) <= right (0)进入while循环:

        center(0) = (left(0) + right(1))/2;

 

now(1) < values[center] (3)进入if:

         right(-1) = right(0) - 1;

 

left (0) <= right (-1)跳出while循环:

        center = 0 ; left = 0 ; right=-1; now = 1; 

 

j(3)=i(4)-1 >= left(0) 进入For循环:

       values[j(3)+1] = values[j(3)];

       valus = 3, 6, 7, 8, 8, 9, 12, 2, 5, 11;

 

j(2)=i(4)-1-1 >= left(0) 进入For循环:

       values[j(2)+1] = values[j(2)];

       valus = 3, 6, 7, 7, 8, 9, 12, 2, 5, 11;

 

j(1)=i(4)-1-1-1 >= left(0) 进入For循环:

       values[j(1)+1] = values[j(1)];

       valus = 3, 6, 6, 7, 8, 9, 12, 2, 5, 11;

 

j(0)=i(4)-1-1-1-1 >= left(0) 进入For循环:

       values[j(0)+1] = values[j(0)];

       valus = 3, 3, 6, 7, 8, 9, 12, 2, 5, 11;

 

i(4) != left(0) 进入if:

       now=1 一直没变;

      values[left(0)] =now(1)

      valus = 1, 3, 6, 7, 8, 9, 12, 2, 5, 11

 

 接下来进入当I=5的循环,过程同上。

 

 

 

三、执行流程分析说明:

 

1、对排序数组values进行从索引0进行递增循环,初入循环始终将左索引(left)设置为0,右索引(right)设置为当前索引向左移一位(i-1),并将当前索引(i)对应数组的值赋值给循环内局部变量now进行备份。

 

2、循环使用左索引(left)与右索引(right)进行比较,如果左索引(left)小于或等于右索引(right)时,取出左右索引之和的中间值索引(center)在values数组中的值(values[center])与当前索引(i)在values数组中的值(now<--values[i]-->)进行比较。

 

      2.1、如果中间索引值(values[center])大于当前索引值(now<--values[i]-->)时,将得到的中间索引(center)向左移动一位重新计算出右索引(right=center-1),继续第2步进行左右索引比较、中间索引值与当前索引值比较。

 

      2.2、如果中间索引值(values[center])小于或等于当前索引值(now<--values[i]-->)时,将得到的中间索引(center)向右移动一位重新计算出左索引(left=center+1),继续第2部进行左右索引比较、中间索引值与当前索引值比较。

 

3、直到左索引(left)已经向右移动超过了右索引(right)时就跳出循环,进入下一步。此时如果2.1或2.2步已经执行过,那么此时跳出循环后得到左索引(left),就是当前索引对应数组值将要插入到数组中的索引位置。

 

4、当前索引向左一位(i-1)循环递减得到的索引与第2步骤得到的左索引(left)进行比较。

 

      4.1、如果当前索引左一位(i-1)循环递减的索引结果(i-1-n)大于或等于以上第2步骤得到的左索引时,将前者索引(i-n-1)对应的数组值赋值给该索引的右一位索引(i-1-n+1)对应的数组值。此时在数组中的(i-1-n)索引值和(i-1-n+1)索引值是相同的。接下来进入下一次第4步循环操作。

 

      4.2、如果当前索引左一位(i-1)循环递减的索引结果(i-1-n)小于第三步得到的左索引时,跳出循环进入到下一步。

 

5、判断第3步获得到的左索引与当前索引进行比较。

 

     5.1、如果不相同时,将第1步获取的now覆值给第3步获得到的左索引对应数组中的值。

 

     5.2、如果相同时,进行下一次第2步循环。

 

 

 

 

分享到:
评论

相关推荐

    常见经典排序算法(C语言)1希尔排序 二分插入法 直接插入法 带哨兵的直接排序法 冒泡排序 选择排序 快速排序 堆排序.docx

    常见的经典排序算法有希尔排序、二分插入法、直接插入法、带哨兵的直接排序法、冒泡排序、选择排序、快速排序、堆排序等。 一、希尔排序(Shell 排序法) 希尔排序法,又称宿小增量排序,是 1959 年由 D.L.Shell ...

    常用算法 2分法插入排序

    2分法插入排序(Binary Insertion Sort)是一种基于插入排序的算法,它结合了二分查找的策略来优化传统插入排序的过程。在传统插入排序中,我们需要将一个新元素与已排序的序列逐个比较,找到合适的位置插入。而2分...

    二分插入排序算法

    使用二分方法实现插入排序

    java二分查找插入法

    二分查找插入法是一种在有序数据集合中高效插入新元素的方法。它结合了二分查找的高效性与插入操作的简单性,尤其适用于大规模数据处理。这种方法的基本思想是首先使用二分查找找到新元素应该插入的位置,然后将该...

    易语言二分插入排序

    二分插入排序是一种在编程领域中常见的排序算法,尤其在使用易语言编程时,它能够有效地对数组进行排序。易语言是一种以中文为程序代码的编程语言,旨在降低编程的难度,让更多的人能够参与到编程中来。在此,我们将...

    易语言源码二分插入排序.rar

    二分插入排序是一种在计算机科学中广泛使用的排序算法,尤其适用于已经部分有序的数组或列表。易语言是一种中国特色的编程语言,它以直观的中文语句形式设计,旨在降低编程难度,让更多人能够掌握编程技术。这个...

    C++ 二分查找法

    此外,对于非静态数据集,如频繁插入或删除元素的情况,需结合其他数据结构(如平衡二叉树)来保持数据有序性,以确保二分查找的高效性。 #### 五、总结 通过以上分析,我们了解到C++中二分查找法的实现细节及其...

    折半插入法_折办插入法_

    折半插入法,又称二分插入排序(Binary Insertion Sort),是一种基于比较的排序算法,它利用了有序序列的特点,通过与中间元素对比来确定新元素的插入位置,从而提高排序效率。下面我们将详细讨论折半插入法的基本...

    直接排序法,折半插入法,希尔排序法,快速排序法(c语言实现)

    2. 折半插入排序(二分插入排序): 折半插入排序是在插入排序的基础上优化的,它利用二分查找的方法降低插入元素时的比较次数。当需要将一个元素插入已排序的部分时,通过二分查找确定插入位置,减少了比较次数,...

    常见经典排序算法.doc

    本文将介绍几种经典的排序算法,包括希尔排序、二分插入法、直接插入法以及带哨兵的直接排序法。 1. **希尔排序(Shell Sort)** 希尔排序是一种基于插入排序的改进算法,由D.L.Shell于1959年提出。它的主要思想是...

    C++代码插入法

    根据提供的文件名“插入法”,我们可以推断这个压缩包可能包含了不同版本或实现方式的C++插入排序代码,可能包括了不同复杂度的版本,如基础插入排序和二分插入排序。 总结来说,插入排序是一种基础的排序算法,它...

    数据结构常见问题:12单元16 经典排序算法.doc

    2. **二分插入法**: 二分插入排序是一种高效的插入排序变体,尤其适用于部分有序的数据。它通过二分查找确定元素的正确位置,然后将元素插入到正确的位置。二分插入排序的时间复杂度为O(n^2),但在近乎有序的数组...

    易语言算法源码(二分直接插入排序)

    - 使用二分查找法在已排序部分中找到适当的插入位置。二分查找可以将查找时间复杂度从线性降低到对数级别。 - 一旦找到插入位置,就需要将该元素依次与已排序部分的后一个元素比较并交换,直到找到正确位置。 3. ...

    java 二分查找法的实现方法

    - 二分查找法还可以应用于其他问题,如查找最近点、插入排序等,通过适当修改判断条件。 6. **性能分析**: 二分查找的时间复杂度为O(log n),空间复杂度为O(1)。相比于线性查找,它在大数据量下有显著优势。 ...

    c语言经典排序算法

    #### 二、二分插入法 二分插入排序是对普通插入排序的一种优化。在插入新元素时,使用二分查找来确定插入的位置,从而减少比较次数。这使得算法在处理大量数据时更为高效。 **特点:** - **时间复杂度**:平均...

    二分探索法查找数据课程设计

    二分探索法,又称二分查找法或二分搜索法,是一种高效的查找算法,尤其适用于已排序的数据集合。它的核心思想源于分治策略,通过不断缩小查找范围来快速定位目标值。在每次查找中,算法将查找区间分为两半,然后比较...

    c语言经典排序算法(8种-含源代码)

    二分插入法(Binary Insertion Sort)也称为折半插入排序,它利用二分查找的方法将待排序的数据插入到已排好序的数组中适当的位置。该方法的优点是每次插入的时间复杂度降低为O(log n),但总体而言,其时间复杂度仍...

    Delphi直接插入法排序示例..rar

    直接插入排序是一种简单直观的排序算法,它的工作原理是通过构造一个有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。这种排序方式适合小规模或者基本有序的数据集,其平均时间复杂度为...

    C语言经典排序算法

    二、二分插入法(Half Insertion Sort) 二分插入排序是插入排序的一种改进版,它使用二分查找找到元素的正确位置,以减少比较次数。这种方法适用于近乎有序的数组。 ```c void HalfInsertSort(int a[], int len) ...

    二分查找法.pptx

    二分查找法,又称折半查找,是一种在有序数组中高效寻找特定元素的搜索算法。它的核心思想是通过不断地将待查找的区间减半来快速定位目标元素。以下是关于二分查找法的详细说明: 1. **使用前提**:二分查找法要求...

Global site tag (gtag.js) - Google Analytics