java实现折半排序算法

Java实现折半排序算法

折半排序(Binary Insertion Sort)是插入排序的一种改进版本,与插入排序相同的是,该算法的平均时间复杂度也为O(n^2),但是折半排序的优势在于其最坏时间复杂度为O(n^2)。

1. 算法原理

折半排序的算法原理如下:

  1. 从第2个元素开始,依次将元素插入到已排序的序列中。
  2. 每次插入时使用折半查找的方式,找到插入元素应该的位置,然后将该位置及其后面的所有元素全部后移一位。
  3. 在空出来的位置插入该元素。

2. 代码实现

以下是Java实现折半搜索排序算法的完整代码:

public static void binaryInsertionSort(int[] arr) {  
    int len = arr.length;  
    int left, right,  mid, temp;  
    for (int i = 1; i < len; i++) {
        temp = arr[i]; 
        left = 0;  
        right = i - 1;  
        while (left <= right) {  
            mid = (left + right) / 2;  
            if (arr[mid] > temp) {  
                right = mid - 1;  
            } else {  
                left = mid + 1;  
            }  
        }  
        for (int j = i - 1; j >= left; j--) {  
            arr[j + 1] = arr[j];  
        }  
        arr[left] = temp;  
    }  
} 

3.示例说明

下面以一个数组{8,2,4,9,3,6}为例来演示该算法的运行过程。

首先进行第一次插入:

temp = 2;
left = 0;
right = 0;

while (left <= right) {
    mid = (left + right) / 2;
    if (arr[mid] > temp) {
        right = mid -1;
    } else {
        left = mid + 1;
    }
}

for (int j = 0; j >= left; j--) {  
    arr[j + 1] = arr[j];  
}  
arr[left] = temp;  

在第一次插入中,将2插入到序列中,并得到排好序的序列{2,8}。

接下来,进行第二次插入:

temp = 4;
left = 0;
right = 1;

while (left <= right) {
    mid = (left + right) / 2;
    if (arr[mid] > temp) {
        right = mid -1;
    } else {
        left = mid + 1;
    }
}

for (int j = 1; j >= left; j--) {  
    arr[j + 1] = arr[j];  
}  
arr[left] = temp;  

在第二次插入中,将4插入到序列中,并得到排好序的序列{2,4,8}。

依次进行下去,可以得到最终的排好序的序列:

{2,3,4,6,8,9}

4.总结

折半排序是一种简单且易于实现的排序算法,虽然其平均时间复杂度与插入排序相同,但是在某些情况下其最坏时间复杂度可以更优,因此也具有一定的实际应用价值。用户在应用该算法时,应根据具体情况选择适当的排序算法,以取得更好的排序效果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java实现折半排序算法 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • java中文及特殊字符的校验方法

    Java中文及特殊字符的校验方法可以通过正则表达式来实现。在Java中,可以使用java.util.regex包提供的正则表达式功能来实现中文及特殊字符的校验。 步骤一:构建正则表达式 构建正则表达式是实现中文及特殊字符校验的第一步。由于中文及一些特殊字符的编码比较复杂,因此需要使用Unicode转义序列来表示这些字符。Unicode转移序列使用\udddd…

    Java 2023年5月26日
    00
  • Java详解实现ATM机模拟系统

    Java详解实现ATM机模拟系统攻略 系统概述 该ATM机模拟系统是用Java语言实现的,包含了模拟受卡人身份认证、存款、取款等操作。此系统模拟银行的ATM机功能,可以满足普通用户的基本需求。 技术栈 Java:Java SE 8版本及以上 IDE:Eclipse, IntelliJ IDEA等 Maven:用于管理依赖 JUnit:用于单元测试 功能模块 …

    Java 2023年5月24日
    00
  • SpringBoot入坑笔记之spring-boot-starter-web 配置文件的使用

    SpringBoot入坑笔记之spring-boot-starter-web配置文件的使用 在Spring Boot中,我们可以使用spring-boot-starter-web依赖来快速构建Web应用程序。在本文中,我们将介绍如何使用spring-boot-starter-web依赖,并提供两个示例。 添加依赖 在pom.xml文件中添加以下依赖: &lt…

    Java 2023年5月15日
    00
  • JAVA IO API使用详解

    Java IO API使用详解 概述 Java IO API是用于读写数据的标准API。Java IO库是一个基于流的库,主要利用了Java中的抽象类和接口来完成对文件的读写操作。 在Java IO库中,主要包括以下三种抽象源: 字节流 字符流 以及文件读写流 字节流 字节流是Java IO库中最基本的流,它支持对字节的输入和输出两种操作。 InputStr…

    Java 2023年5月20日
    00
  • Java C++题解leetcode1598文件夹操作日志搜集器

    让我详细地讲解一下Java C++题解LeetCode 1598文件夹操作日志搜集器的完整攻略。 简介 这是一道LeetCode的题目。题目描述为:假设您正在设计一款简单的奇怪编辑器,每次打开它时,编辑器都会仅显示全部文本中最后一次输入的字符。执行一些操作后,您希望能够查看并恢复到某些之前的状态。为了实现这个功能,您需要设计一个操作日志记录数据结构。该数据结…

    Java 2023年5月20日
    00
  • java之assert关键字用法案例详解

    Java之assert关键字用法案例详解 概述 本文将详细讲解Java中的assert关键字用法,并给出案例说明。 assert是Java语言的一个关键字,用于进行程序断言。assert关键字的作用是在开发和调试期间,为程序员提供了一个简单有效的集成测试方法,可以确保代码的正确性和程序的可靠性。 assert的语法格式 assert语法格式如下: asser…

    Java 2023年5月26日
    00
  • Spring Boot + Kotlin整合MyBatis的方法教程

    接下来我将详细讲解“Spring Boot + Kotlin整合MyBatis的方法教程”的完整攻略,过程中包含两条示例说明。 1. 环境准备 在开始整合之前,我们需要先准备好以下环境: JDK 1.8+ Kotlin 1.3+ Spring Boot 2.0+ MyBatis 3.4+ 2. 添加依赖 在开始整合之前,我们需要先在 build.gradle…

    Java 2023年6月1日
    00
  • Java中I/O输入输出的深入讲解

    Java中I/O输入输出的深入讲解 什么是I/O I/O(Input/Output)指的是数据的输入和输出,是计算机与程序外部世界进行信息交互的方式之一。在Java中,I/O被视为一种Java API,提供了许多与文件、网络和其他I/O设备进行数据输入和输出的类和方法。 I/O的主要类型 字节流 字节流(Byte Stream)以字节为单位进行操作,可以读写…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部