zoukankan      html  css  js  c++  java
  • Java中的基础排序算法(二):简单选择排序、堆排序

    参考文章:https://mp.weixin.qq.com/s/VjqZNPg6dAEReAzqZcb_yw

    原文链接:www.jianshu.com/p/5e171281a387

     3.简单选择排序 —— 常用于取序列中最大最小的几个数时。

    (如果每次比较都交换,那么就是交换排序;如果每次比较完一个循环再交换,就是简单选择排序。)

    1. 遍历整个序列,将最小的数放在最前面。

    2. 遍历剩下的序列,将最小的数放在最前面。

    3. 重复第二步,直到只剩下一个数。

    如何写成代码:

    1. 首先确定循环次数,并且记住当前数字和当前位置。

    2. 将当前位置后面所有的数与当前数字进行对比,小数赋值给 key,并记住小数的位置。

    3. 比对完成后,将最小的值与第一个数的值交换。

    4. 重复 2、3 步。

    public void selectSort(int[] a) {
            int length = a.length;
            for (int i = 0; i < length; i++) {//循环次数
                int key = a[i];
                int position=i;
                for (int j = i + 1; j < length; j++) {//选出最小的值和位置
                    if (a[j] < key) {
                        key = a[j];
                        position = j;
                    }
                }
                a[position]=a[i];//交换位置
                a[i]=key;
            }
        }

    4.堆排序 —— 对简单选择排序的优化。

    1. 将序列构建成大顶堆。

    2. 将根节点与最后一个节点交换,然后断开最后一个节点。

    3. 重复第一、二步,直到所有节点断开。

    public  void heapSort(int[] a){
            System.out.println("开始排序");
            int arrayLength=a.length;
            //循环建堆
            for(int i=0;i<arrayLength-1;i++){
                //建堆
    
                buildMaxHeap(a,arrayLength-1-i);
                //交换堆顶和最后一个元素
                swap(a,0,arrayLength-1-i);
                System.out.println(Arrays.toString(a));
            }
        }
        private  void swap(int[] data, int i, int j) {
            // TODO Auto-generated method stub
            int tmp=data[i];
            data[i]=data[j];
            data[j]=tmp;
        }
        //对data数组从0到lastIndex建大顶堆
        private void buildMaxHeap(int[] data, int lastIndex) {
            // TODO Auto-generated method stub
            //从lastIndex处节点(最后一个节点)的父节点开始
            for(int i=(lastIndex-1)/2;i>=0;i--){
                //k保存正在判断的节点
                int k=i;
                //如果当前k节点的子节点存在
                while(k*2+1<=lastIndex){
                    //k节点的左子节点的索引
                    int biggerIndex=2*k+1;
                    //如果biggerIndex小于lastIndex,即biggerIndex+1代表的k节点的右子节点存在
                    if(biggerIndex<lastIndex){
                        //若果右子节点的值较大
                        if(data[biggerIndex]<data[biggerIndex+1]){
                            //biggerIndex总是记录较大子节点的索引
                            biggerIndex++;
                        }
                    }
                    //如果k节点的值小于其较大的子节点的值
                    if(data[k]<data[biggerIndex]){
                        //交换他们
                        swap(data,k,biggerIndex);
                        //将biggerIndex赋予k,开始while循环的下一次循环,重新保证k节点的值大于其左右子节点的值
                        k=biggerIndex;
                    }else{
                        break;
                    }
                }
            }
        }
  • 相关阅读:
    ARM开发工具软件命令具体解释---嵌入式回归第三篇
    Java模拟公司置办货物系统(二)
    springmvc mybatis 声明式事务管理回滚失效,(checked回滚)捕捉异常,传输错误信息
    Django Drops
    从 &quot;org.apache.hadoop.security.AccessControlException:Permission denied: user=...&quot; 看Hadoop 的用户登陆认证
    iOS中Storyboard使用要点记录
    ACdream 1084 寒假安排(阶乘素因子分解)
    【死磕Java并发】-----J.U.C之AQS:CLH同步队列
    使用freemarker做邮件发送模板
    springboot 使用freemarker自定义标签
  • 原文地址:https://www.cnblogs.com/lotuses/p/11640671.html
Copyright © 2011-2022 走看看