首页 > 编程语言 >十大经典排序算法(Java)--正在更新。。

十大经典排序算法(Java)--正在更新。。

时间:2022-11-11 15:15:37浏览次数:43  
标签:arr Java Scanner -- System int array 排序

十大经典排序算法(2022年11月11日更新)

1、冒泡排序

冒泡排序是接下来的十大排序中最简单的排序。

1.1 方法描述

简单来说,排序方法就是重复地走过要排序的数列,一次比较相邻的两个元素,如果顺序不满足从小到大(从大到小),就将这两个元素交换,重复地进行,知道没有再需要交换。排序方式:In-place(需要申请额外空间-临时变量)

1.2 算法描述

  1. 从第一个元素开始比较,比较相邻的元素。如果第一个比第二个大(小),就交换他们两个。
  2. 对每一对相邻元素做同样的工作,不断重复,直到排序完成。

1.3 动图描述

1.4 代码实现(Java语言)

  • 从小到大排序:
package Sort;  // 自己定义的包

import java.util.Scanner;  // 导入的外部jar包

public class BubbleSort {
    public static void main(String[] args) {
        /**
         * 从小到大排序:
         */
        System.out.println("请输入十个数:");
        Scanner sc = new Scanner(System .in);
        int [] arr = new int[10];
        // 数组输入方法:(for循环)
        for (int i = 0;i < arr.length;i++){ 
            arr[i] = sc.nextInt();
        }
        
        // 双层for循环,第一层循环为每个数除了最后一个数,都要进行党的的一遍循环,故循环次数为(arr.length - 1)次.
        for (int i = 0; i <arr.length;i++){
            for (int j = 0;j<arr.length-i-1;j++){
         // 若两数相比,前数比后数大,因为从小到大排序,故将两个数进行交换。交换需要一个临时变量,用来当中介,进行交换。
                if (arr[j+1] < arr[j]){
                    int temp = arr[j+1];
                    arr[j+1] = arr[j];
                    arr[j] = temp;
                }
            }
        }

        System.out.println("从小到大排序为:");
        // 使用foreach循环进行输出已排序好的数组。
        for (int i:arr) {
            System.out.print(i+" ");
        }
   }
}

  • 从大到小排序:
package Sort;  // 自己定义的包

import java.util.Scanner;  // 导入的外部jar包

public class BubbleSort {

    public static void main(String[] args) {       
        /**
         * 从大到小:
         */
        System.out.println("请输入十个数:");
        Scanner scanner = new Scanner(System.in);
        int [] arr = new int[10];
        for(int i = 0;i <arr.length;i++){
            arr[i] = scanner.nextInt();
        }
        for (int i = 0;i < arr.length; i++){
            for (int j = 0; j < arr.length - i - 1; j++){
         // 从大到小和从小到大排序基本相同,只有接下来交换的部分,当两数进行比较时,后数大于前数时,进行交换。
                if (arr[j+1] > arr[j]){
                    int temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
        System.out.println("从大到小为:");
        for (int i:arr ) {
            System.out.print(i+" ");
        }
    }

1.5 算法分析

  • 最好情况-- O(n)
    初始数组就为从大到小(从小到大),只需要比较 O(n),n为数组的元素。
  • 最坏情况--O(n2)
    若需要数组为从小到大排序,初始数组为从大到小。最坏的情况就是初始数组为倒序排序,故最坏情况为 O(n2)。所以复杂度为 O(n2)
  • 稳定性:
    稳定。

2、选择排序

选择排序是表现最稳定的排序算法之一。

2.1 方法描述

首先在未排序的序列中找到最小(大)元素,存放到排序序列中的起始位置。然后,再从剩余未排序的元素中继续找最小(大)元素,然后存放到已排序序列的末尾。一次类推,直到所有元素均排序完成。

2.2 算法描述

n个元素的通过直接选择排序经过n-1次选择排序得到有序结果。

  1. 将数组分为无序区和有序区。初始无序区为所有未排数,有序区为空。
  2. 第 i 趟排序开始时,当前有序区为[1~i-1],无序区为[i ~ n]。每趟排序从当前无序区找出最小(最大)元素,将他与 无序区的第一个元素交换。每一趟排序,无序区减少一个元素,而有序区增加一个元素。
  3. n-1趟结束,数组排序结束。

2.3 动图描述

2.4 代码实现(Java语言)

package Sort;

import java.util.Scanner;

public class SelectionSort {
    public static int[] SelectionSort(int[] array) {
        if (array.length == 0){
            return array;
        }
        for (int i = 0;i < array.length; i++){
            int minIndex = i;
            for (int j = i; j < array.length; j++){
                if (array[j] < array[minIndex]){   // 找到最小的数
                    minIndex = j;    // 将最小的数的索引保存
                }
            }
            // 将找到的最小数与无序区的第一个数进行交换
            int temp = array[minIndex];
            array[minIndex] = array[i];
            array[i] = temp;
        }

       return array;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入十个数:");
        int [] arr = new int[10];
        for (int i = 0;i < arr.length; i++){
            arr[i] = scanner.nextInt();
        }
        int[] sort = SelectionSort(arr);
        System.out.println("从小到大排序为:");
        for (int i:sort) {
            System.out.print(i+" ");
        }
    }
}

2.5 算法分析

  • 最佳情况:
    O(n2)
  • 最坏情况:
    O(n2)
  • 稳定情况:
    不稳定。

标签:arr,Java,Scanner,--,System,int,array,排序
From: https://www.cnblogs.com/Firmiana-wuhu/p/16880467.html

相关文章

  • jvm垃圾回收与算法
    1如何确定垃圾java采用引用计数法与可达性分析来确定是否回收垃圾。其中引用计数法会容易产生循环引用的问题。可达性分析通过根搜索算法来实现。根搜索算法以一系列GC......
  • springboot 发布tomcat(zip包)
    废话不多说一POM调试时使用tomcat,打包时过滤tomcat包<dependencies><dependency><groupId>org.springframework.boot</groupId><......
  • C# Hashtable、HashSet和Dictionary的区别
    原文网址:https://blog.csdn.net/yyyyz999/article/details/1248512251.Hashtable哈希表(HashTable)表示键/值对的集合。在.NETFramework中,Hashtable是System.Collect......
  • C# 浅谈 接口(Interface)的作用
    继承"基类"跟继承"接口"都能实现某些相同的功能,但有些接口能够完成的功能是只用基类无法实现的1.接口用于描述一组类的公共方法/公共属性.它不实现任何的方法或属性,只是......
  • 操作系统速成——5.设备管理
    五.设备管理5.1设备管理的目标使用方便、效率高、管理同意、与设备无关  5.2IO设备分类存储设备或输入输出设备块设备或字符设备低速中速高速设备 IO控制方式......
  • pytest--测试函数
    参考链接https://docs.python.org/zh-cn/3/reference/simple_stmts.html?highlight=assert#grammar-token-assert_stmt断言assert在pytest中,assert是编写测试的最基......
  • Sublime如何在每一行行首增加字符串
    第一步:选中全部内容ctrl+A第二步:进入待操作状态ctrl+shift+L第三步:通过←和→控制光标的位置第四步:在光标处添加内容注:也可以只对多行进行操作,对多行进行操作只需在......
  • HTTP代理购买如何选套餐
    爬虫工作离不开HTTP代理的支持,选择合适的HTTP代理套餐可以让工作事半功倍,但网上各种各样的套餐实在是太多了,太难选择了,爬虫业务千千万,对HTTP代理的需求都不一样,因此,针......
  • DataLoader 每次迭代返回BatchEncoding还是dict类型依pytorch的版本而定
    发现DataLoader在不同的pytorch版本上,执行dataset的__item__会返回不同的效果。pytorch在1.12.1上,每一次迭代会返回BatchEncoding这个类型(可能会比这个版本低也......
  • Vue3 企业级优雅实战 - 组件库框架 - 3 搭建组件库开发环境
    前文已经初始化了workspace-root,从本文开始就需要依次搭建组件库、example、文档、cli。本文内容是搭建组件库的开发环境。1packages目录前面在项目根目录下创建了p......