选择排序-Java「建议收藏」

选择排序-Java「建议收藏」堆排序理论:https://blog.csdn.net/qq_36186690/article/details/82505569代码:packagecom.paixu.paixuTest;importjava.util.Arrays;importjava.util.Scanner;/***选择排序*1)简单选择排序*2)堆排序*/publicclassxuanZhePaiXu{publicstaticvoidmain(String[]a

大家好,又见面了,我是你们的朋友全栈君。

堆排序理论:

https://blog.csdn.net/qq_36186690/article/details/82505569

代码:

package com.paixu.paixuTest;

import java.util.Arrays;
import java.util.Scanner;

/** * 选择排序 * 1)简单选择排序 * 2)堆排序 */
public class xuanZhePaiXu { 
   
    public static void main(String[] args) { 
   
        System.out.println("请输入带排序数,以空格间隔:");
        Scanner scanner = new Scanner(System.in);
        int[] arr = new int[5];
        while (scanner.hasNext()) { 
   
            for (int i = 0; i < arr.length; i++) { 
   
                arr[i] = scanner.nextInt();
            }
            // 1、简单选择排序
            jianDanZuanZhr(arr);

            // 2、堆排序
            duiPaiXu(arr);

        }
    }

    /** * 堆排序 * @param arr * 堆满足两个条件 1)完全二叉树 2)父节点必须大于或者等于子节点,或者是小于等于 * 堆排序的过程: * 1)先将无序的序列构造成大顶堆或者小顶推(升序就构造大顶堆、降序就构造小顶堆) * 2)将堆顶元素与末尾元素交换,将最大元素"沉"到数组末端; * 3)重新调整结构,使其满足堆定义,然后继续交换堆顶元素与当前末尾元素,反复执行调整+交换步骤,直到整个序列有序。 */
    private static void duiPaiXu(int[] arr) { 
   
        // 构造大顶堆 从第一个非叶子节点开始,从下至上,从左往右
        for (int i = arr.length/2-1;i>=0;i--){ 
   
            adjustHeap(arr,i,arr.length);
        }
        // 调整堆结构+交换顶堆元素与末尾元素
        for (int j=arr.length-1;j>0;j--){ 
   
            swap(arr,0,j);  // 交换元素
            adjustHeap(arr,0,j);  // 交换元素后,又重新构造大顶堆
        }
        System.out.println("堆排序:"+Arrays.toString(arr));

    }

    private static void swap(int[] arr, int a, int b) { 
   
        int temp = arr[a];
        arr[a] = arr[b];
        arr[b] = temp;
    }

    /** * 构造大顶推 * @param arr * @param i * @param length * 父亲:(i-1)/2 * 子节点:2i+1 2i+2 */
    private static void adjustHeap(int[] arr, int i, int length) { 
   
        int temp = arr[i];
        for (int k=i*2+1;k<length;k=i*2+1){ 
     //从i结点的左子结点开始,也就是2i+1处开始
            if (k+1<length && arr[k]<arr[k+1]){ 
    //如果左子结点小于右子结点,k指向右子结点
                k++;
            }
            if (arr[k]>temp){ 
     //如果子节点大于父节点,将子节点值赋给父节点(不用进行交换)
                arr[i] = arr[k];  // 子节点的值赋值给了父节点,那么最后原本父节点的值也要给子节点
                i = k;  // 子节点的下标赋值给i,为了最后赋值
            }else { 
   
                break;
            }
        }
        arr[i] = temp;

    }

    /** 简单选择排序 * 每次从后面选择一个最小的与前面设置的最小的交换 * @param arr */
    private static void jianDanZuanZhr(int[] arr) { 
   
        for (int i=0;i<arr.length-1;i++){ 
   
            int min = i;  // 初始化第一个最小
            for (int j=i+1;j<arr.length;j++){ 
   
                if (arr[j]<arr[min]){ 
   
                    min = j;
                }
            }
            if (min!=i){ 
     // 不等,说明有比他小的元素。
                int temp = arr[min];
                arr[min] = arr[i];
                arr[i] = temp;
            }
        }
        System.out.println("简单选择排序:"+Arrays.toString(arr));
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/156958.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • css怎么改鼠标样式,如何利用CSS改变鼠标的样式

    css怎么改鼠标样式,如何利用CSS改变鼠标的样式各种各样的鼠标样式,对于经常使用电脑的人而言一定不会生疏。当鼠标移动到不同的地方时,当鼠标执行不同的功能时,鼠标的外形都会发生变化。但在网页上,貌似只有当鼠标在超级链接上时才出现一个手形,在其它地方似乎没有什么变化,同布满动感的网页显得不怎么和谐。实际上,用css可以方便地定义许多种鼠标外形。下面小编就为大家介绍一下怎样利用CSS改变鼠标的样式。用CSS改变鼠标的样式,我们使用cursor属性,现…

    2022年5月31日
    36
  • html实战-制作静态网页「建议收藏」

    html实战-制作静态网页「建议收藏」教程视频:http://edu.csdn.net/course/detail/535 从42开始制作的网页:http://www.cnos.co/整体思路:先布局再CSS控制骨架搭好了,初始化样式,后再弄CSS样式。注意:将CSS的样式导入到外部样式表时,要注意图片的位置,以及对外部样式表的引入  1、头部的背景图片的高度128px来自素材的图片高,容器的宽度大

    2025年9月15日
    6
  • win10系统显示打印机未连接到服务器,解决win10提示“Windows无法连接到打印机”的方法…

    win10系统显示打印机未连接到服务器,解决win10提示“Windows无法连接到打印机”的方法…打印机是我们办公室中必备的设备,如今各种打印方式也是层出不穷。最近有用户在使用win10系统进行打印的时候遇到了这样的提示信息:“windows无法连接到打印机”。在更详细的信息提示界面中已经告诉我们是由于本地打印店额后台服务程序没有启用导致的,少数用户在将电脑重新启动之后解决了这个问题,不过大多数的朋友还是得通过手动重启服务才能开始打印。如何才能手动设置这个服务呢,让小编来给大家演示一下吧!方…

    2022年6月11日
    61
  • 学习java的好书及视频推荐

    学习java的好书及视频推荐转载来自:点击打开链接要想在java领域成为大牛,除了不断进行项目实战以外,还要不断的进行进修和学习,以下将本人学习java多年使用的好书和一些好的视频推荐给大家,这些书和视频都是本人在网络找了很久,后来又经过实践证明的好书和视频。希望对大家学习java有帮助首先,是书的推荐:1学习java,java基础,1.0 入门:HeadFirstJava(

    2022年6月21日
    27
  • 天翼1号 2021 5G全网通云手机_2021年再买5g手机

    天翼1号 2021 5G全网通云手机_2021年再买5g手机2021年天翼智能生态博览会期间,展锐基于中国电信的5GSA网络,在天翼1号2021手机上完成了5G网络切片端到端业务验证,成功验证了云监控、云桌面、云手机、天翼超高清、小翼管家、云游戏等业务,这标志着天翼1号2021已具备网络切片能力。演示采用的切片目标方案由展锐和中国电信研究院联合研发,方案基于展锐调制解调器中心化(Modem-Centric)架构设计,中国电信研究院研发了终端切片中间件SDK,天翼1号终端适配开发,成功实现了应用程序未作任何修改的前提下顺利接入5G切片网络。本次业务验证意味着应用

    2022年9月1日
    7
  • 斗地主老是输?一起用Python做个AI出牌器![通俗易懂]

    斗地主老是输?一起用Python做个AI出牌器![通俗易懂]前言最近在网上看到一个有意思的开源项目,快手团队开发的开源AI斗地主——DouZero。今天我们就一起来学习制作一个基于DouZero的斗地主出牌器,看看AI是如何来帮助我们斗地主的吧!首先一起来看看AI出牌器的效果:下面,我们开始介绍这个AI出牌器的制作过程。一、核心功能设计首先我们这款出牌器是基于DouZero开发的,核心是需要利用训练好的AI模型来帮住我们,给出最优出牌方案。其次关于出牌器,先要需要确认一个AI出牌角色,代表我们玩家自己。我们只要给这个A

    2022年4月29日
    84

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号