折半插入排序是对直接插入排序进行了改进,在寻找插入点时使用二分查找算法,提高了查询效率。
升序排序:
/** * 折半插入排序 * 升序排序 */ @Override public <T extends Comparable<? super T>> void sortByAsc(T[] data) { for(int i = 1;i < data.length;i++ ){ if(data[i].compareTo(data[i - 1]) < 0){ /**记录i的值*/ T temp = data[i]; /**记录搜索范围的左边界*/ int low = 0; /**记录搜索范围的右边界*/ int high = i - 1; while(low <= high){ /**记录中间位置*/ int mid = (high + low)/2; /**比较中间位置数据和i处数据大小,以缩小搜索范围*/ if(data[mid].compareTo(temp) < 0){ low = mid + 1; }else{ high = mid - 1; } } /**移动low~i处数据整体向后移动*/ for(int j = i; j > low; j--){ data[j] = data[j - 1]; } data[low] = temp; } } }
降序排序:
/** * 折半插入排序 * 降序排序 */ @Override public <T extends Comparable<? super T>> void sortByDesc(T[] data) { for(int i = 1;i < data.length;i++ ){ if(data[i].compareTo(data[i - 1]) > 0){ /**记录i的值*/ T temp = data[i]; /**记录搜索范围的左边界*/ int low = 0; /**记录搜索范围的右边界*/ int high = i - 1; while(low <= high){ /**记录中间位置*/ int mid = (high + low)/2; /**比较中间位置数据和i处数据大小,以缩小搜索范围*/ if(data[mid].compareTo(temp) > 0){ low = mid + 1; }else{ high = mid - 1; } } /**移动low~i处数据整体向后移动*/ for(int j = i; j > low; j--){ data[j] = data[j - 1]; } data[low] = temp; } } }
时间: 2024-10-05 23:55:51