Java基础数组-选择排序算法

简介: Java基础数组-选择排序算法

选择排序:


每一次从这堆“参与比较的数据当中”找出最小值

拿着这个最小值和“参与比较的这堆最前面的元素”交换位置。

选择排序比冒泡排序好在:每一次的交换位置都是有意义的。


关键点:选择排序中的关键在于,你怎么找出一堆数据中最小的。

3 2 6 1 5


假设:


第一个3是最小的。


3和2比较,发现2更小,所以此时最小的是2.


继续拿着2往下比对,2和6比较,2仍然是最小的。


继续拿着2往下比对,2和1比对,发现1更小,所以此时最小的是1.


继续拿着1往下比对,1和5比对,发现1还是小的,所以1就是最小的。


拿着1和最左边的3交换位置。


假设:


第一个2是最小的。



6 3 5


假设6是最小的:


6和3比对,发现3更小,所以此时最小的是3.



选择排序比冒泡排序的效率高。


高在交换位置的次数上。

选择排序的交换位置是有意义的。

循环一次,然后找出参加比较的这堆数据中最小的,拿着这个最小的值和

最前面的数据“交换位置”。


参与比较的数据:3 1 6 2 5 (这一堆参加比较的数据中最左边的元素下标是0)

第1次循环之后的结果是:

1 3 6 2 5


参与比较的数据:3 6 2 5 (这一堆参加比较的数据中最左边的元素下标是1)

第2次循环之后的结果是:

2 6 3 5


参与比较的数据:6 3 5 (这一堆参加比较的数据中最左边的元素下标是2)

第3次循环之后的结果是:

3 6 5


参与比较的数据:6 5 (这一堆参加比较的数据中最左边的元素下标是3)

第4次循环之后的结果是:

5 6


注意:5条数据,循环4次。


示例代码:


public class SelectSort {
    public static void main(String[] args) {
        //初始化一个一维数组
        int[] arr = {3,1,6,2,5,8,4};
        int count = 0;
        int count2 = 0;
        //选择排序
        //7条数据循环6次。(外层循环6次)
        for(int i = 0;i< arr.length-1;i++){
            //猜测最小值
            //i正好是“参加比较的这堆数据中“最左边那个元素的下标”
            //i是一个参与比较的这堆数据中的起点下标
            //假设起点i下标位置上的元素是最小的
            int min = i;
            for(int j = i + 1;j< arr.length;j++) {
                //统计比较次数
                count++;
                if (arr[j] < arr[min]) {
                    min = j;//最小值的元素下标是j
                }
            }
                //当i和min相等时,表示最初猜测是对的
                //当i和min不相等是,表示最初猜测是错的,有比这个元素更小的元素
                //需要拿着这个更小的元素和最左边的元素交换位置
                if (min != i) {
                    //表示存在更小的数据
                    //arr[min]最小的数据
                    //arr[i] 最前面的数据
                    int temp;
                    temp = arr[min];
                    arr[min] = arr[i];
                    arr[i] = temp;
                    //统计交换次数
                    count2++;
            }
        }
        // 冒泡排序和选择排序实际上比较的次数没变。
        // 交换位置的次数减少了。
        System.out.println("比较了多少次:" + count);
        System.out.println("交换了多少次:" + count2);
        //遍历排序之后的数组
        for (int i = 0;i< arr.length;i++){
            System.out.println(arr[i]);
        }
    }
}


运行结果:


0a2653c851af460fa595bd959398a8f1.png

相关文章
|
1月前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
30 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
23天前
|
存储 缓存 算法
Java 数组
【10月更文挑战第19天】Java 数组是一种非常实用的数据结构,它为我们提供了一种简单而有效的方式来存储和管理数据。通过合理地使用数组,我们能够提高程序的运行效率和代码的可读性。更加深入地了解和掌握 Java 数组的特性和应用,为我们的编程之旅增添更多的精彩。
31 4
|
23天前
|
存储 缓存 算法
提高 Java 数组性能的方法
【10月更文挑战第19天】深入探讨了提高 Java 数组性能的多种方法。通过合理运用这些策略,我们可以在处理数组时获得更好的性能表现,提升程序的运行效率。
21 2
|
1月前
|
存储 Java
Java“(array) <X> Not Initialized” (数组未初始化)错误解决
在Java中,遇到“(array) &lt;X&gt; Not Initialized”(数组未初始化)错误时,表示数组变量已被声明但尚未初始化。解决方法是在使用数组之前,通过指定数组的大小和类型来初始化数组,例如:`int[] arr = new int[5];` 或 `String[] strArr = new String[10];`。
|
1月前
|
存储 算法 定位技术
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
这篇文章主要介绍了稀疏数组和队列的概念、应用实例以及如何使用数组模拟队列和环形队列的实现方法。
21 0
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
|
1月前
|
存储 算法 Java
带你学习java的数组军队列
带你学习java的数组军队列
35 0
|
11天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
50 4
|
2月前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
410 37
|
1月前
|
存储 安全 Java
java基础面试题
java基础面试题
29 2
|
3月前
|
Java
【Java基础面试四十一】、说一说你对static关键字的理解
这篇文章主要介绍了Java中static关键字的概念和使用规则,强调了类成员与实例成员的区别及其作用域的限制。