• 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;
                    }
                }
            }
        }
  • 相关阅读:
    浏览器回退
    几个小东西
    获取用户的IP
    easyui datagrid中 formatter的用法
    vscode安装go语言插件失败解决方法
    c#项目NLOG不显示日志
    C# 抽象类与接口的区别
    用SQL Server事件探查器创建跟踪
    使用MathJax在博客园里添加数学公式
    概率主题模型简介 Introduction to Probabilistic Topic Models
  • 原文地址:https://www.cnblogs.com/lotuses/p/11640671.html
Copyright © 2020-2023  润新知