按升序對棧進行排序

按升序對棧進行排序(即最大元素位於棧頂)。最多隻能使用一個額外的棧存放臨時數據,但不得將元素複製到別的數據結構(如數組)。java

該棧支持以下操做:push, pop, peek,和isEmpty算法

若是能夠支持兩個棧,咱們能夠每一次遍歷棧1,將最小的元素放入棧2,把棧3做爲搜索時的緩衝區數組

一、方法一:實現初步的排序算法:搜索整個棧,找出最小元素,以後將其壓入另外一個棧。而後,在剩餘元素中找出最小的壓入棧。數據結構

 

注意:實際上須要三個棧:s1爲原棧,s2位最終排好序的棧,s3在搜索s1時用做緩衝區。在s1中搜索最小值,須要彈出s1的元素,並將它們壓入緩衝區s3。但最多隻能使用一個額外的棧,此方法不合適。app

 

 

二、方法二:spa

/** 
 * 從s1中逐一彈出元素,按順序插入s2中。
 */

 

咱們不須要反覆搜索棧1來依次得到最小值,假設棧s是要排序的棧,棧r是已排序的棧.net

s = [5,10,7]blog

r = [12,8 ,3,1]排序

棧頂元素5在r中的正確位置應該是3的上面,咱們能夠先彈出5,反正5是不管如何都要從s壓入r的,而後將12和8壓入棧s,而後將5壓入棧r遞歸

注意這是12和8沒有在r中了,可是隻要咱們不改變它們在s中的順序,重複上面的步驟,12和8一次從s彈出再壓入r仍是在5的上面,r依然是有序的。

時間複雜度爲O(n^2),空間複雜度O(n)

 

[java] view plain copy

 

  1. import java.util.Stack;  
  2.   
  3.   
  4. public class sort {  
  5.     public static Stack<Integer> sortStk(Stack<Integer> s) {  
  6.         Stack<Integer> r = new Stack<Integer>();  
  7.         while( !s.isEmpty() ) {  
  8.             int temp = s.pop();  
  9.             while ( !r.isEmpty() && r.peek() > temp) {  
  10.                 s.push(r.pop());  
  11.             }  
  12.             r.push(temp);  
  13.         }  
  14.         return r;  
  15.     }  

方法三:

前提:若容許使用的棧數量不限。實現修改版的快速排序和歸併排序,要求每層遞歸都建立兩個額外的棧。

 *歸併排序:建立兩個棧,並將原棧分爲兩部分。遞歸排序每一個棧,而後將其歸併到一塊兒並排好序,放回原來的棧中。

 *快速排序:建立兩個額外的 棧,並根據基準元素(pivot element)將這個棧分爲兩個棧,這兩個棧會進行遞歸排序,而後歸併在一塊兒,放回原來的棧中。

相關文章
相關標籤/搜索