首页 > 其他分享 >堆排序

堆排序

时间:2022-08-25 17:34:58浏览次数:50  
标签:arr target int 堆排序 source 顶栈 Stack

package com.lianzhu.filemanage.utils;

import java.util.Stack;

/**
 * 栈排序
 * @description:栈的特性:先进后出  如空数组【】
 * @step1:有一串数字 4,8,7,9,2,6
 * 依次按照顺序 4 8 7  9  2  6放入【】然后就是这种【629784】
 * 然后取出来的时候就是6  2  9  7   8   4
 * 可以理解为一个桶,先进去的放在最里面,最后放进去的在最外边,这样取出来的时候就先取
 * 最外边的,最后取最先面的
 */
public class StackSort {



    private static void twoStackSort(int[] arr){
        //source原栈
        Stack<Integer> source = new Stack<Integer>();
        for(int i = 0; i < arr.length; i++){
            source.push(arr[i]);
        }
        //target目标栈
        Stack<Integer> target = twoStackSort(source);
        while(!target.isEmpty()){
            System.out.println(target.pop());
        }
    }

    /**
     * step1:原栈source不为空,目标栈source为空,把原栈target顶栈元素放入目标栈
     * step2:原栈source不为空,目标栈target不为空,把source顶栈元素与target进行比较
     *        1.0循环判断target不为空且顶栈元素大于source顶栈元素v,
     *        2.0把target大于source顶栈元素取出放入source
     *        3.0把v放入target
     * step3: 循环step1与step2
     * 特点:改变target v的判断逻辑可以把输出改为升序,目前输出是降序
     * @param source
     * @return
     */
    private static Stack<Integer> twoStackSort(Stack<Integer> source) {
        Stack<Integer> target = new Stack<Integer>();
        while(!source.isEmpty()){
            if(target.isEmpty()){
                target.push(source.pop());
            }else{
                int v = source.pop();
                if(target.peek() <= v){
                    target.push(v);
                }else{
                    while(!target.isEmpty() && target.peek() > v){
                        source.push(target.pop());
                    }
                    target.push(v);
                }
            }
        }
        return target;
    }

    public static void main(String[] args) {
        int arr[]=new  int []{98,5,4,61,3,2,57,4,65};
        twoStackSort(arr);
    }
}

 

标签:arr,target,int,堆排序,source,顶栈,Stack
From: https://www.cnblogs.com/wangbiaohistory/p/16625012.html

相关文章

  • 堆排序 与 比较器
    堆排序假如给你一无序的数组,经过堆排序获得一组降序的数组1、首先我们将数组遍历,进行heapInsert,变为一个大根堆,建立堆的过程方法一:正序遍历+heapInsertO(N*logN)当需......
  • 经典排序之堆排序
    堆排序思路堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序可以说是一种利用堆的概念来排序的选择排序。分......
  • 由浅入深!一文带你彻底明白堆排序
    本文中所有的代码全都是大根堆!实现语言是Java图片来源都是这位大神的,大神的文章也给了我很多启发数据结构之堆堆排序这个视频通俗易懂从什么是堆,什么是堆化,再到实现......
  • 十大排序算法之【堆排序】
    堆排序代码://头文件省略voidheapify(vector<int>&in,intbottom,inttop){intlargest=top;intlson=top*2+1;intrson=top*2+1;if(lson......
  • 快速排序和堆排序
    python快速排序、堆排序、计数排序、桶排序、基数排序_一只什么都不懂的码农的博客常用排序算法总结和对比_玖玖拾月陆的博客-CSDN博客_各种排序算法的总结和比较#快速......