快排 遞歸 非遞歸

我記得曾經 有一個大師說過這麼一句話,大概的意思是說若是你懂得了編程,那麼請你給我用非遞歸表達你的思想。我想非遞歸隱藏的東西偏偏應該是程序員應該注意的東西。由於遞歸的隱藏,讓咱們其實沒有真正的理解實現的具體細節。今天我想用非遞歸的方式去作一下快排。java

你們都應該知道快排:程序員

一、不穩定排序編程

二、時間複雜度:O(nlogn)。糟糕的時候時間複雜度是O(n*n)數組

思想是學習

1借用一個元素爲flag 讓數組左面的數組小於該flag,右面的數大於該flag。ui

2左右分割區域繼續找flag遞歸1步驟。this

非遞歸的思想更可以清楚的描述快排的思想。排序

一、設置兩個棧區,分別記錄先後區域的初始位置和結束爲止。(開始爲數組的0位置和終止位置len-1)遞歸

二、用快排思想找到flag。而後判斷先後區域是否爲空,若是有一個不爲空說明還有須要排序的數據。不然排序過程結束。ip

package example;

import java.util.Stack;

/**
* Created by Administrator on 2015/11/29.
*/
public class QuickSort {

public static void main(String[] args){
int[] a =new int[]{1,11,4,23,2,78,54,99,102,100,22,34};

       Stack<Integer> start =new Stack<Integer>();
       Stack<Integer> end =new Stack<Integer>();

       start.push(0);
       end.push(a.length-1);

while(!start.isEmpty()){
int start1= start.pop();
int end1 = end.pop();
int   priot=partition(a,start1,end1);
if(priot>start1+1){
               start.push(start1);
               end.push(priot-1);
           }
if(priot<=end1-1){
               start.push(priot+1);
               end.push(end1);
           }
       }
for(int i=0;i<a.length;i++){
           System.out.println(a[i]);
       }


   }

private static int partition(int[] a, int start1, int end1) {
int priot = a[start1];
int start =start1;

while(start1<end1){
while(a[start1]<priot) start1++;
while (a[end1]>priot)  end1--;
swap(a,start1,end1);
        }
       a[start1]=priot;
return start1;

   }

private static void swap(int[] a, int start1, int end1) {
int tmp=a[start1];

       a[start1]=a[end1];
       a[end1]=tmp;
   }


}

2016年8月3日

遞歸今天寫了下,仍是總犯錯啊!!!,貼出代碼吧,繼續學習

/**遞歸快排
 * @author hassop
 * @Description
 * @date 2016/8/3 0003
 * To change this template use File | Settings | File Templates.
 */
public class QuickSearch {
    /**
     * 非遞歸
     * @param a
     */
    static void quick(int[] a,int begin,int end){
        //終止條件
        if(begin==end){
            return;
        }

      int i=begin+1;
      int j=end;
      int k =a[begin];

      //排序過程
      while(i<j){
          while(a[j]>k){
              j--;

          }
          while(a[i]<k&&i<j){
              i++;
          }
          sweap(a,i,j);

      }
        sweap(a, begin, i);
        if((i-1)>=begin){
            quick(a,begin,i-1);
        }else {
            quick(a,begin,begin);
        }

        if((i+1)>=end){
            quick(a,end,end);

        }else{
            quick(a,i+1,end);
        }

       }

    static void sweap(int[] a,int i, int j) {
        int tmp =a[i];
        a[i]= a[j];
        a[j]=tmp;
    }


    /*psvm*/
    public static void main(String[] args) {
      int[] a ={2,1,3,4,19,5,6,8,39,21,65};
        quick(a, 0, a.length - 1);
        for(int i=0;i<a.length;i++){
            System.out.println(a[i]);
        }

    }
}
相關文章
相關標籤/搜索