程序员面试金典--题目解析-3.6 对栈进行排序

本文介绍了一种栈排序算法,通过一个额外的栈实现最大值位于栈顶的基本排序,并提供了使用数组和快速排序优化时间复杂度至O(nlog(n))的进阶方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

3.6 题目:

对栈进行排序,要求最大的值存放在栈顶。

基础:只能使用一个额外的栈存储临时数据。

进阶:
允许使用多个栈或其他数据结构,将时间复杂度优化为O(nlog(n))


解法:

基础解法,下面画图分步骤说明:

初始状态:S1为未排序的栈,S2为空栈

S1S2
5null
10null
7null

弹出栈顶元素5,发现S2为空,直接放进去

S1S2
nullnull
10null
75

弹出栈顶元素10,S2不为空,对比S2的栈顶元素5,发现大于5,可以直接放入

S1S2
nullnull
null10
75

弹出栈顶元素7,S2不为空,对比S2的栈顶元素10,发现小于10,把10弹出放入S1
然后接着对比7和新的栈顶元素5,发现小于5,放入即可。

S1S2
nullnull
null7
105

弹出S1栈顶元素10,S2不为空,10大于S2的栈顶元素7,直接放入。

S1S2
null10
null7
null5

代码如下:

public static Stack<Integer> sort(Stack<Integer> s){
        Stack<Integer> result = new Stack<Integer>();
        while(!s.isEmpty()){
            Integer value = s.pop();
            while(!result.isEmpty() && result.peek() > value){
                s.push(result.pop());
            }
            result.push(value);
        }
        return result;
    }

该解法的时间复杂度为O(N^2) 空间复杂度为O(N)


进阶解法

1、如果允许使用数组,可以把栈复制为数据,然后使用JDK的Arrays.sort 方法,进行排序即可

代码如下:

public static void stackToArraySort(Stack<Integer> s){
        Object[] anArray = new Object[s.size()];
        s.copyInto(anArray);
        Arrays.sort(anArray);
        for(int i = 0;i<s.size();i++){
            s.set(i, (Integer)anArray[i]);
        }
    }

2、自己实现一个快速排序
代码如下:

public static Stack<Integer> quickSort(Stack<Integer> s){
        qSort(s,0,s.size()-1);
        return s;
    }

    private static void qSort(Stack<Integer> s, int low, int high) {
        int pivot;
        if(low<high){
            pivot = partition(s,low,high);
            qSort(s,low,pivot-1);
            qSort(s,pivot+1,high);
        }
    }

    private static int partition(Stack<Integer> s, int low, int high) {
        int pivotKey = s.get(low);
        while(low < high){
            while(low < high && s.get(high)>=pivotKey)
                high--;
            swap(s,low,high);

            while(low < high && s.get(low)<= pivotKey)
                low++;

            swap(s,low,high);
        }
        return low;
    }

    private static void swap(Stack<Integer> s, int low, int high) {
        int temp = s.get(low);
        s.set(low,s.get(high));
        s.set(high, temp);
    }

关于快速排序的原理,可以参考其他资料,这里不再赘述。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值