亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

搜索
java - 不用遞歸如何實現(xiàn)快速排序?
天蓬老師
天蓬老師 2017-04-17 17:32:13
[Java討論組]

今天想到一個問題,我記得《劍指offer》這本書里面說過:遞歸都可以轉(zhuǎn)換成循環(huán)。那么怎么用循環(huán)來實現(xiàn)快速排序,我迄今為止看到的所有快速排序都是用的遞歸,于我試著寫,想了半個小時居然一點頭緒都沒有。

有哪位大大能夠?qū)懷h(huán)實現(xiàn)的,想開開眼界

天蓬老師
天蓬老師

歡迎選擇我的課程,讓我們一起見證您的進步~~

全部回復(3)
阿神

用棧儲存,對著改就好了

function qsort_with_loop(arr) {
  let stack = [];

  stack.push([0, arr.length - 1]);

  while (stack.length) {
    let _ = stack.pop();
    let i = l = _[0];
    let j = r = _[1];
    let mid = arr[(i + j) >> 1];

    do {
      while (arr[i] < mid) ++i;
      while (arr[j] > mid) --j;
      if (i <= j) {
        let t = arr[i];
        arr[i] = arr[j];
        arr[j] = t;
        ++i;
        --j;
      }
    } while (i <= j);

    if (i < r) stack.push([i, r]);
    if (l < j) stack.push([l, j]);
  }
}

寫了兩個版本,你對照一下: https://jsfiddle.net/hsfzxjy/ob8x16uz/4/

PHP中文網(wǎng)

可以用棧儲存狀態(tài) 也就是高級語言實現(xiàn)遞歸的本質(zhì)

巴扎黑
import java.util.Stack;
//快速排序的非遞歸實現(xiàn),利用系統(tǒng)的棧stack
public class QuickSortNonRecursion {
     public static void main(String[] args) {
         QuickSortNonRecursion qsnr = new QuickSortNonRecursion();
         int[] array = {0, 2, 11, 121, 18, 99, 3, 5, 101, 22, 9, 100};
         qsnr.quicksort(array);
          for (int i : array) {
                System.out.print(i + "  ");
          }
        }
                 
        public void quicksort(int[] array) {
            if (array == null || array.length == 1) return;
            //存放開始與結(jié)束索引
            Stack<Integer> s = new Stack<Integer>(); 
            //壓棧       
            s.push(0); 
            s.push(array.length - 1); 
            //利用循環(huán)里實現(xiàn)
            while (!s.empty()) { 
                int right = s.pop(); 
                int left = s.pop(); 
                //如果最大索引小于等于左邊索引,說明結(jié)束了
                if (right <= left) continue; 
                         
                int i = partition(array, left, right); 
                if (left < i - 1) {
                    s.push(left);
                    s.push(i - 1);
                } 
                if (i + 1 < right) {
                    s.push(i+1);
                    s.push(right);
                }
            } 
        }
        //找到軸心,進行交換
        public int partition (int[] data, int first, int end)
        {
            int temp;
            int i=first,j=end;
            if(first<end)
            {
                temp=data[i];
                //當i=j的時候,則說明掃描完成了
                while(i<j)
                {
                    //從右邊向左邊掃描找到一個小于temp的元素
                    while(j>i&&data[j]>temp)j--;
                    if(i<j)
                    {
                        //將該元素賦值給temp
                        data[i]=data[j];
                        //賦值后就應(yīng)該將i+1指向下一個序號
                        i++;
                    }
                           
                    //然后從左邊向右邊開始掃描,找到一個大于temp的元素
                    while(i<j&&temp>data[i])i++;
                    if(i<j)
                    {
                        //將該元素賦值給temp
                        data[j]=data[i];
                        //賦值后就應(yīng)該將j-1指向前一個序號
                        j--;
                    }
                }
                //將軸數(shù)據(jù)放在i位置中
                data[i]=temp;
            }
            return i;
        }
    }
最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板
關(guān)于我們 免責申明 意見反饋 講師合作 廣告合作 最新更新
php中文網(wǎng):公益在線php培訓,幫助PHP學習者快速成長!
關(guān)注服務(wù)號 技術(shù)交流群
PHP中文網(wǎng)訂閱號
每天精選資源文章推送
PHP中文網(wǎng)APP
隨時隨地碎片化學習
PHP中文網(wǎng)抖音號
發(fā)現(xiàn)有趣的

Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號