Java实现折半(二分)插入排序

 1 /*折半插入查找思想:每趟将一个带排序的元素作为关键字插入到已经排好的部分序列的适当位置上,查找适当位置的方法用折半查找法
 2  * 适合记录数较多的场景
 3  * 在查找插入位置时节省了时间
 4  * 在记录移动次数方面和直接插入查找是一样的,所以时间复杂度还是O(n^2)
 5  * 空间复杂度同为O(1)*/
 6
 7 import java.util.Scanner;
 8
 9 public class zhebancharusort {
10
11     public static void main(String args[]){
12         Scanner cin = new Scanner(System.in);
13         String str = cin.nextLine();
14         String st[] = str.split(" ");
15         int num[] = new int[st.length];
16         for(int i=0;i<st.length;i++){
17             num[i]=Integer.parseInt(st[i]);
18         }
19         sort(num);
20         for(int j=0;j<st.length;j++){
21             System.out.print(num[j]);
22             System.out.print(" ");
23         }
24         cin.close();
25     }
26     public static void sort(int R[]){
27         for(int i=1;i<R.length;i++){
28             if(R[i]<R[i-1]){
29                 int low=0;
30                 int high=i-1;
31                 int temp = R[i];
32                 while(low<=high){
33                     int mid = (int)((low+high)/2);
34                     if(R[mid]<temp){
35                         low=mid+1;
36                     }else{
37                         high=mid-1;
38                     }
39                 }
40                 for(int j=i;j>low;j--){
41                     R[j]=R[j-1];
42                 }
43                 R[low]=temp;
44             }
45         }
46     }
47 }
时间: 2024-10-04 10:09:04

Java实现折半(二分)插入排序的相关文章

快速排序/二分插入排序的swift以及Java实现

经常会用到排序的算法,比如:冒泡法,选择法,快速排序,二分插入排序等等.前面两个就不说了,贴出来自己写的快速排序和二分插入排序的Swift及Java的代码实现,喜欢的话control+C拿去用. swift实现快速排序和二分插入排序算法: (想运行的话,直接复制代码,替换掉控制器里的viewDidLoad方法就好了) override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading

Java使用二分插入排序竟然和直接插入排序速度相差不多

?? Java使用二分插入排序竟然和直接插入排序速度相差不多 之前测试过Python使用二分插入排序竟然比直接插入排序快99倍! 现在测试下 Java,Linux测试结果如下: javac test.java java testInsertSort total milliseconds:15769InsertSortWithBinarySerach total milliseconds:15657 程序如下: import java.util.Date; public class test{ p

我的Java开发学习之旅------&gt;Java经典排序算法之二分插入排序

一.折半插入排序(二分插入排序) 将直接插入排序中寻找A[i]的插入位置的方法改为采用折半比较,即可得到折半插入排序算法.在处理A[i]时,A[0]--A[i-1]已经按关键码值排好序.所谓折半比较,就是在插入A[i]时,取A[i-1/2]的关键码值与A[i]的关键码值进行比较,如果A[i]的关键码值小于A[i-1/2]的关键码值,则说明A[i]只能插入A[0]到A[i-1/2]之间,故可以在A[0]到A[i-1/2-1]之间继续使用折半比较:否则只能插入A[i-1/2]到A[i-1]之间,故可

二分插入排序JAVA实现

package kpp.sort; /** * 当前待插入元素data[i],若data[i]>=data[i-1],则表示排序正常,i++处理下一个元素 * 若data[i]<data[i-1],先保存data[i]至temp,二分查找到适合插入的位置k,从k到i-1的元素顺序右移 * 将temp插入到k * * 分析: * 二分插入排序的比较次数与待排序记录的初始状态无关,仅依赖于记录的个数. * 当n较大时,比直接插入排序的最大比较次数少得多.但大于直接插入排序的最小比较次数. * 算法

java之折半查找

//功能:二分查找import java.util.*; public class Demo1 {    public static void main(String[] args) {      int arr[]={2,5,7,12,25};//定义arr数组并赋值      System.out.print("请输入你需要查找的数:");      Scanner sr=new Scanner(System.in);      int a=sr.nextInt();      B

Java实现折半查找(二分法)

利用Java实现折半查找 基本思路:while递归循环,不断判断a[middle]是否等于data,如果等于则跳出循环,返回索引值,如果不等,则进行二分处理,直至两者相等为止:其中通过count计数器记录查找次数,当count次数超过20次时视为元素不存在(此处有待优化) package test; /* * 二分法查找(折半查找) * TGmoving * */ public class halfSearch { public static int HalfSearch(int a[],int

直接插入排序与二分插入排序的C++实现

1.直接插入排序 直接插入排序的过程可以理解为一个固定长度的数组被分为两个集合,即已排序集合和未排序. 开始时已排序集合为空,而未排序集合即为整个数组.当排序开始后插入一个对象,已排序集合元素数目加1,相应地未排序集合元素数目减1,重复插入过程直至将未排序集合清空为止,这时排序集合就是最终结果.如下图: C++实现如下,为了使得程序可以对各种基本数据类型都能排序,使用了模板类,注意模板类的类声明和成员函数实现必须在同一个cpp文件里面,不能分开!! 1 #ifndef INSERTSORT_H

直接插入排序、二分插入排序、希尔排序、冒泡排序与简单选择排序

一.直接插入排序 稳定,时间复杂度:最好O(n).最差O(n^2).平均O(n^2),空间复杂度O(1) void InsertSort(int L[], int n) { int i, j,key; for (i = 1; i<n; i++) if(L[i] < L[i-1])//需要将L[i]插入到有序表L[0...i-1] { key = L[i]; for(j = i-1; j >= 0 && key < L[j]; j--)//后移 L[j+1] = L[

【数据结构与算法 00】二分插入排序

算法思想(从小到大排序) N1:遍历数组 array[10000], i 为数组坐标,从1开始 N2:以 i 为基数 tmpV=array[i],[0 ,i-1] 为区间坐标,(0+i-1)/2 为 mid 坐标 N3:比较 tmpV 与 array[mid],如果大于,则区间为 [mid+1,i-1],否则为[0,mid-1] N4:遍历所有 i 实现以上递归步骤,直到 右坐标<左坐标,因为 while 递归判断时:right>left 区间还有n个数,正常递归,当right=left=mi

八大排序算法学习笔记:插入排序(二分插入排序)

二分插入排序   也称折半插入排序, 1.基本思想:设数列[0....n]分为两部分一部分是[0...i]为有序序列,另一部分是[i+1.....n]为无序序列,从无序序列中取一个数 x ,利用二分查找算法找到 x 在有序序列中的插入位置并插入,有序序列还是有序的,接下来重复上述步骤,直到无序序列全部插入有序序列 ,这是整个序列只剩下有序序列即有序了. 2.代码:    3.复杂度: 用二分插入排序所要进行的总比较次数为O(lgn),当n较大时,比直接插入排序的最大比较次数小得多,但大于最小比较