折半插入排序其實就是直接插入排序的一種改進(jìn),引入了二分查找算法,這樣關(guān)鍵字的比較次數(shù)就會減少,
數(shù)量級為O(nlog^2n),但是元素移動次數(shù)還是O(n^2),所以折半插入排序的時間復(fù)雜度是O(n^2)。
另外,折半插入排序是穩(wěn)定的排序算法;
下面是用JAVA寫的算法的兩種實現(xiàn)方式。不過原理都是一樣的
第一種:
package sort;
Java代碼
- import java.util.Arrays;
-
- public class BinarySearch1 {
- public static void main(String args[])
- {
- int array[]={49,38,65,97,76,13,27};
- binarySort(array,array.length);
- System.out.println("---------排序后的結(jié)果----------");
- System.out.println(Arrays.toString(array));
- }
-
- //二分查找
- public static int binarySearch(int array[],int low,int high,int temp)
- {
- int mid=0;
- while(low<=high)
- {
- mid=(low high)/2;
- if(array[mid]<temp&&temp<=array[mid 1])
- return (mid 1);
- else if(array[mid]<temp)
- low = mid 1;
- else
- high = mid -1;
- }
- return high;
- }
-
- //二分排序
- public static void binarySort(int array[],int size)
- {
- int i,j,k,temp;
- for(i=1;i<size;i )
- {
- temp=array[i];
- if(array[i]<array[0])
- k=0;
- else
- k = binarySearch(array,0,i,temp);
-
- for(j=i;j>k;j--)
- {
- array[j]=array[j-1];
- }
- array[k]=temp;
- System.out.println(Arrays.toString(array));
- }
- }
- }
運(yùn)行結(jié)果如下:
[38, 49, 65, 97, 76, 13, 27]
Java代碼
- [38, 49, 65, 97, 76, 13, 27]
- [38, 49, 65, 97, 76, 13, 27]
- [38, 49, 65, 76, 97, 13, 27]
- [13, 38, 49, 65, 76, 97, 27]
- [13, 27, 38, 49, 65, 76, 97]
- ---------排序后的結(jié)果----------
- [13, 27, 38, 49, 65, 76, 97]
第二種:
Java代碼
- package sort;
-
- import java.util.Arrays;
-
- public class BinarySearch2 {
- public static void main(String args[])
- {
- int array[]={49,38,65,97,76,13,27};
- binaryInsertSort(array,array.length);
- System.out.println("------------排序后的結(jié)果-------------");
- System.out.println(Arrays.toString(array));
- }
-
- /**
- *
- * @param array 要排序的數(shù)組
- * @param size 數(shù)組的大小
- */
- public static void binaryInsertSort(int []array,int size)
- {
- int i,j,temp;
- int low,high,mid;
- for(i=1;i<size;i )
- {
- //將待插入的元素賦給temp,這個元素前面是有序數(shù)組,用于插入到有序數(shù)組中
- temp=array[i];
- low=0;
- high=i-1;
- while(low<=high)
- {
- //有序數(shù)組的中間坐標(biāo),此時用于二分查找,減少查找次數(shù)
- mid = (low high)/2;
- //如果有序序列中的中間元素大于待排序的元素,則有序序列的中間坐標(biāo)向前搜索,否則向后搜索
- if(array[mid]>array[i])
- high=mid-1;
- else
- low = mid 1;
- }
- /**
- * j首先賦值為要插入值的前一個元素的最后的坐標(biāo),也就是有序數(shù)組中最后一個元素的坐標(biāo)
- * 然后依次向前掃描有序數(shù)組,然后如果滿足條件則向后移動數(shù)據(jù)
- */
-
- for(j=i-1;j>=low;j--)
- {
- array[j 1]=array[j];
- }
- //將待排序的元素插入到array數(shù)組中
- array[low]=temp;
- System.out.println(Arrays.toString(array));
- }
- }
-
- }
運(yùn)行結(jié)果:
Java代碼
- [38, 49, 65, 97, 76, 13, 27]
- [38, 49, 65, 97, 76, 13, 27]
- [38, 49, 65, 97, 76, 13, 27]
- [38, 49, 65, 76, 97, 13, 27]
- [13, 38, 49, 65, 76, 97, 27]
- [13, 27, 38, 49, 65, 76, 97]
- ------------排序后的結(jié)果-------------
- [13, 27, 38, 49, 65, 76, 97]
|