快速排序算法在Java中的实现

下面我们来详细讲解“快速排序算法在Java中的实现”的完整攻略。

快速排序算法简介

快速排序(Quicksort)算法是基于分治思想的一种高效的排序算法,由Tony Hoare于1959年发明。其思路是选择一个枢纽元素(pivot),然后将待排序数据分为左右两个子序列,左子序列所有元素均小于枢纽元素,右子序列所有元素均大于等于枢纽元素。接着递归地对左右两个子序列进行快速排序,最后将排好序的左子序列、枢纽元素和排好序的右子序列合并起来即可。

快速排序算法的时间复杂度为O(nlogn),在大多数情况下表现良好。

Java中快速排序算法的实现

下面我们就来介绍Java中快速排序算法的实现。

算法实现

在Java中,我们可以使用递归实现快速排序算法。具体实现过程如下:

public static void quickSort(int[] arr, int left, int right) {
    if (left >= right) {
        return;
    }
    int pivot = arr[(left + right) / 2];
    int i = left, j = right;
    while (i <= j) {
        while (arr[i] < pivot) {
            i++;
        }
        while (arr[j] > pivot) {
            j--;
        }
        if (i <= j) {
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
            i++;
            j--;
        }
    }
    quickSort(arr, left, j);
    quickSort(arr, i, right);
}

以上代码中,我们使用额外的两个指针i和j来进行数组划分,pivot用于选择枢纽元素。代码中,我们首先选取中间位置的元素作为枢纽元素。接着在while循环中,我们让i指针指向第一个大于等于pivot的元素;j指针指向第一个小于等于pivot的元素。此时,如果i<=j,我们交换arr[i]和arr[j]的值,接着让i++,j--,继续向中间靠拢。当i>j时,我们递归地对左右两个子序列进行快速排序即可。

示例说明

我们用一个简单的示例来说明快速排序算法的实现过程。

假设有待排序数组arr={5, 2, 1, 3, 4},按照实现过程,我们先选取中间位置的元素作为枢纽元素,即pivot=arr[2]=1。然后,左指针i从左端开始向右移动,i=0时,arr[i]=5大于1,停止移动;右指针j从右端开始向左移动,j=4时,arr[j]=4小于1,停止移动。因为此时满足i<=j,所以交换arr[i]和arr[j]的值,即arr[i]=4,arr[j]=5,此时arr={4, 2, 1, 3, 5},接着i++,j--,继续向中间靠拢。

接下来,i从1开始向右移动,i=1时,arr[i]=2小于1,停止移动;j从3开始向左移动,j=3时,arr[j]=3大于1,停止移动。因为此时满足i<=j,所以交换arr[i]和arr[j]的值,即arr[i]=3, arr[j]=2,此时arr={4, 3, 1, 2, 5},接着i++,j--,继续向中间靠拢。

此时,i>j,递归地对左半部分数组{4, 3, 1}和右半部分数组{2, 5}进行快速排序,并将结果合并即可。

另外一个示例详见以下代码块中。

public static void main(String[] args) {
    int[] arr = {10, 80, 30, 90, 40, 50, 70};

    System.out.println("原数组:");
    for (int i : arr) {
        System.out.print(i + " ");
    }

    quickSort(arr, 0, arr.length - 1);

    System.out.println("\n排序后的数组:");
    for (int i : arr) {
        System.out.print(i + " ");
    }
}

输出结果如下:

原数组:
10 80 30 90 40 50 70 
排序后的数组:
10 30 40 50 70 80 90

总结

以上就是关于快速排序算法在Java中的实现的完整攻略,我们希望对你有所帮助。如果您还有其他问题或疑问,可以在留言区留言,我们会尽快回复。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:快速排序算法在Java中的实现 - Python技术站

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

相关文章

  • java多线程实现同步锁卖票实战项目

    当多个线程同时对共享资源进行访问时,可能会引发数据竞争和错误的结果。Java 提供了多种同步机制来避免这种情况,其中最常用的是互斥锁。在这个实战项目中,我们将实现一个卖票系统,并使用 Java 多线程和同步锁来确保多个线程同时访问同一资源的正确性。 需求描述 我们要实现一种买票系统,共有三个窗口,每个窗口可以同时售卖 100 张票。当所有的票都售出后,系统应…

    Java 2023年5月18日
    00
  • java实现统一异常处理的示例

    下面是“java实现统一异常处理的示例”的完整攻略: 1. 异常处理的重要性 在Java开发中,异常是不可避免的。这就需要我们对异常进行处理,以保证系统的稳定性、可靠性和安全性。Java提供了异常处理机制,但这并不意味着我们在程序中用了try-catch语句,就可以完全不用考虑异常的处理了。相反,正确的异常处理是非常重要的。 2. 统一异常处理的原理 在Ja…

    Java 2023年5月28日
    00
  • 基于EJB技术的商务预订系统的开发

    开发基于EJB技术的商务预订系统可以分为以下几个步骤: 1. 需求分析和系统设计 在需求分析和系统设计阶段,需要考虑以下因素: 系统的功能需求,例如用户登录、商品展示、购物车管理、订单管理、支付管理等; 系统的性能需求,例如用户并发量、数据处理量、响应时间、可靠性等; 系统的架构设计,例如服务器端容器的选择、数据库的设计、系统的分层设计等。 示例1:用户登录…

    Java 2023年6月15日
    00
  • springboot配置mybatis和事务管理方式

    下面是一份关于配置Spring Boot中MyBatis和事务管理的完整攻略,包含两个示例。 一、配置MyBatis和数据库 首先,需要在pom.xml文件中添加MyBatis和数据库依赖 <!– MyBatis依赖 –> <dependency> <groupId>org.mybatis.spring.boot&lt…

    Java 2023年5月20日
    00
  • Java 如何解析key为动态的json操作

    使用JsonNode解析动态key的Json 使用Jackson库中的JsonNode对象可以在解析动态key的Json时非常有用。JsonNode对象可以类比Java的DOM节点进行操作从而解析Json。可以像以下这样使用JsonNode解析动态key的Json: String jsonString = "{\"key1\":…

    Java 2023年5月26日
    00
  • 利用js获取下拉框中所选的值

    获取下拉框中所选的值是很常见的前端开发需求。可以使用Javascript来轻松实现这一功能。下面提供几种获取下拉框值的方法供大家参考。 通过select元素的selectedIndex属性获取值 select元素有一个selectedIndex属性,可以返回当前选中项在集合中的索引位置。 示例1: <select id="mySelect&q…

    Java 2023年6月15日
    00
  • 两种用空格分隔的java字符串的方式

    确实,Java中有两种使用空格分隔字符串的方法: 使用split方法: split方法允许您将字符串分裂成子字符串数组,方法如下: String[] strArray = "Hello World".split(" "); 这将创建一个字符串数组,其中包含两个元素: “Hello” 和 “World”。您可以使用for…

    Java 2023年5月27日
    00
  • Java8如何构建一个Stream示例详解

    下面就详细讲解Java8如何构建一个Stream示例。 什么是Stream? Stream是Java8新引入的流式处理API,它可以使得对集合的操作更加高效,简洁,易于维护。通过使用Stream,我们可以完成众多集合操作,如转化、过滤、聚合等等。 构建一个Stream实例 构建一个由数值组成的流 可以通过如下代码构建一个由数值组成的流。 Stream<…

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