java基础算法系列(三)(选择排序的简单优化讲解)

简介: java基础算法系列(三)(选择排序的简单优化讲解)

选择排序也是十大排序算法中的一种,他是将整个数组从头到尾全部扫描一遍,然后选择最小的与第一位进行交换,接着再在剩下的元素中进行扫描,直到扫描完毕,最终,得到一个有序数列。这是一种思路非常简单的排序算法。我们先简单的实现一下,代码如下:

public static void main(String[] args) {
        int[] arr = { 1, 3, 4, 2, 6, 7, 8, 0, 5 };
        int n = arr.length - 1;// 经过n-1次提取最小最大值
        long startTime = System.nanoTime(); // 获取开始时间
        for (int i = 0; i < arr.length - 1; i++) {
            int min = i;
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[min] > arr[j]) {
                    min = j;
                }
            }
            if (min != i) {
                int tmp = arr[min];
                arr[min] = arr[i];
                arr[i] = tmp;
            }
        }
        long endTime = System.nanoTime(); // 获取结束时间
        System.out.println("排序結果:" + Arrays.toString(arr));
        System.out.println("程序运行时间: " + (endTime - startTime) + "ns");
    }

打印结果如下:

排序結果:[0, 1, 2, 3, 4, 5, 6, 7, 8]
程序运行时间:3100ns

最基本的选择排序是一次将一个元素进行位置的确定,那么我们可不可以一次确定两个元素的位置呢?

优化代码如下:

public static void main(String[] args) {
        int[] arr = { 1, 3, 4, 2, 6, 7, 8, 0, 5 };
        long startTime = System.nanoTime(); // 获取开始时间
        // 最小值下标
        int min = 0;
        // 最大值下标
        int max = 0;
        int left = 0;
        int right = arr.length - 1;
        int j = 0;
        // 循环size-1次
        while (left < right) {
            max = left;
            min = right;
            // 确定最大值下标以及最小值下标
            for (j = left; j <= right; j++) {
                if (arr[j] > arr[max]) {
                    max = j;
                }
                if (arr[j] < arr[min]) {
                    min = j;
                }
            }
            // 将最大值插到最后
            if (max != right) {
                int tmp = arr[max];
                arr[max] = arr[right];
                arr[right] = tmp;
            }
            // 防止minpos在最大值要插入的位置
            if (min == right) {
                min = max;
            }
            // 将最小值插到最前面
            if (min != left) {
                int tmp = arr[min];
                arr[minpos] = arr[left];
                arr[left] = tmp;
            }
            left++;
            right--;
        }
        long endTime = System.nanoTime(); // 获取结束时间
        System.out.println("排序結果:" + Arrays.toString(arr));
        System.out.println("程序运行时间: " + (endTime - startTime) + "ns");
    }

打印结果如下:

排序結果:[0, 1, 2, 3, 4, 5, 6, 7, 8]
程序运行时间:2600ns

有朋友要问了,为什么要加上这段代码呢:

if (min == right) {
            min = max;
        }

比如数组{ 1, 3, 4, 2, 6, 7, 8, 0, 5 };max=0,min=8;

max!=8,交换0和8,[0, 1, 2, 3, 4, 5, 6, 7, 8]但是max依旧是0,minpos依旧是8,min!=0,又再次交换0和8.

  所以为防止min在最大值要插入的位置,要加上上面这块代码。


相关文章
|
2天前
|
Java
Java并发编程中的锁优化策略
【5月更文挑战第21天】在Java并发编程中,锁是一种常用的同步机制。为了提高程序的性能,我们可以采用一些锁优化策略。本文将介绍几种常用的锁优化策略,包括锁粗化、锁消除和锁分解,并通过实例代码演示这些策略的使用。
|
2天前
|
并行计算 安全 算法
探索Java并发编程:Fork/Join框架的应用与优化
在多核处理器普及的今天,并发编程已经成为提高程序性能的重要手段。Java提供了多种并发工具,其中Fork/Join框架是处理分治任务的强大工具。本文将深入探讨Fork/Join框架的核心原理、使用场景以及性能优化技巧,帮助开发者更好地利用这一框架解决实际问题。通过实例分析,我们将看到如何有效地使用Fork/Join框架来加速计算密集型任务,并提供一系列最佳实践,以确保高效和线程安全的并发执行。
|
2天前
|
算法 Java
Java中CAS算法的集中体现:Atomic原子类库,你了解吗?
【5月更文挑战第15天】Java中CAS算法的集中体现:Atomic原子类库,你了解吗?
15 1
|
5天前
|
Java
深入理解Java并发编程:线程池的应用与优化
【5月更文挑战第18天】本文将深入探讨Java并发编程中的重要概念——线程池。我们将了解线程池的基本概念,应用场景,以及如何优化线程池的性能。通过实例分析,我们将看到线程池如何提高系统性能,减少资源消耗,并提高系统的响应速度。
15 5
|
5天前
|
算法 搜索推荐 Java
滚雪球学Java(33):数组算法大揭秘:应用案例实战分享
【5月更文挑战第8天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
32 8
滚雪球学Java(33):数组算法大揭秘:应用案例实战分享
|
5天前
|
Java 编译器
Java并发编程中的锁优化策略
【5月更文挑战第18天】在Java并发编程中,锁是一种常用的同步机制,用于保护共享资源的访问。然而,不当的锁使用可能导致性能问题和死锁风险。本文将探讨Java中锁的优化策略,包括锁粗化、锁消除、锁分离和读写锁等技术,以提高并发程序的性能和可靠性。
|
6天前
|
算法
MATLAB|【免费】融合正余弦和柯西变异的麻雀优化算法SCSSA-CNN-BiLSTM双向长短期记忆网络预测模型
这段内容介绍了一个使用改进的麻雀搜索算法优化CNN-BiLSTM模型进行多输入单输出预测的程序。程序通过融合正余弦和柯西变异提升算法性能,主要优化学习率、正则化参数及BiLSTM的隐层神经元数量。它利用一段简单的风速数据进行演示,对比了改进算法与粒子群、灰狼算法的优化效果。代码包括数据导入、预处理和模型构建部分,并展示了优化前后的效果。建议使用高版本MATLAB运行。
|
6天前
|
Java 编译器
Java 并发编程中的锁优化策略
【5月更文挑战第17天】在 Java 并发编程中,锁是一种常见的同步机制,用于保护共享资源的访问。然而,不当使用锁可能导致性能问题和死锁风险。本文将探讨 Java 中的锁优化策略,包括锁粗化、锁消除、锁降级以及读写锁等技术,以提高并发程序的性能和可靠性。
|
机器学习/深度学习 人工智能 算法
|
1天前
|
Java 调度
【JAVA学习之路 | 提高篇】线程的通信
【JAVA学习之路 | 提高篇】线程的通信