每天刷個演算法題20160525:快速排序的遞迴轉非遞迴解法
版權所有。所有權利保留。
歡迎轉載,轉載時請註明出處:
http://blog.csdn.net/xiaofei_it/article/details/51524798
為了防止思維僵化,每天刷個演算法題。已經刷了幾天了,現在發點程式碼。
我已經建了一個開源專案,每天的題目都在裡面:
https://github.com/Xiaofei-it/Algorithms
絕大部分演算法都是我自己寫的,沒有參考網上通用程式碼。讀者可能會覺得有的程式碼晦澀難懂,因為那是我自己的理解。
最近幾天都是在寫一些原來的東西,大多數是非遞迴。以後準備刷點DP、貪心之類的題。
下面是快速排序的遞迴轉非遞迴解法。
是不是沒有人像我這樣蛋疼地把快速排序寫成非遞迴的???
/**
*
* Copyright 2016 Xiaofei
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package xiaofei.algorithm;
import java.util.Stack;
/**
* Created by Xiaofei on 16/5/25.
*
*/
public class QuickSort {
private static int[] array;
private static void sortCorecursively(int l, int r) {
class Element {
int l;
int r;
int i;
int state;
//這裡用state表示通用狀態,和之前非遞迴程式碼風格不一樣。
Element(int l, int r) {
this.l = l;
this.r = r;
this.i = -1;
this.state = 0;
}
}
Stack<Element> stack = new Stack<>();
stack.push(new Element(l, r));
while (!stack.isEmpty()) {
Element element = stack.peek();
if (element.state == 0) {
int i = element.l, j = element.r, m = array[(i + j) / 2];
do {
while (array[i] < m) {
++i;
}
while (m < array[j]) {
--j;
}
if (i <= j) {
int temp = array[i];
array[i] = array[j];
array[j] = temp;
++i;
--j;
}
} while (i <= j);
element.i = i;
if (element.l < j) {
stack.push(new Element(element.l, j));
}
element.state = 1;
} else if (element.state == 1) {
if (element.i < element.r) {
stack.push(new Element(element.i, element.r));
}
element.state = 2;
} else if (element.state == 2) {
stack.pop();
}
}
}
public static void sort(int[] array) {
QuickSort.array = array;
sortCorecursively(0, array.length - 1);
}
}
相關文章
- 每天刷個演算法題20160524:阿克曼函式的遞迴轉非遞迴解法演算法函式遞迴
- 每天刷個演算法題20160523:騎士巡遊的遞迴轉非遞迴解法演算法遞迴
- 快速排序【遞迴】【非遞迴】排序遞迴
- 快速排序(遞迴及非遞迴演算法原始碼)排序遞迴演算法原始碼
- 每天刷個演算法題20160521:二叉樹高度(遞迴與非遞迴)演算法二叉樹遞迴
- 氣泡排序、快速排序(遞迴&非遞迴)、堆排序演算法比較淺析排序遞迴演算法
- 遞迴-*快速排序遞迴排序
- 揹包問題的遞迴與非遞迴演算法遞迴演算法
- 遞迴演算法轉換為非遞迴演算法的技巧遞迴演算法
- 快速排序-遞迴方式排序遞迴
- 資料結構與演算法——歸併排序: 陣列&連結串列&遞迴&非遞迴解法全家桶資料結構演算法排序陣列遞迴
- 每天刷個演算法題20160518:非遞迴二叉樹遍歷演算法遞迴二叉樹
- Python 八皇后解法(非遞迴版本)Python遞迴
- 二十一、氣泡排序演算法——JAVA實現(遞迴與非遞迴)排序演算法Java遞迴
- 【刷題】二叉樹非遞迴遍歷二叉樹遞迴
- 歸併排序的非遞迴實現排序遞迴
- 【C++】翻轉二叉樹(遞迴、非遞迴)C++二叉樹遞迴
- 二十、快速排序演算法——JAVA實現(遞迴)排序演算法Java遞迴
- 原:八皇后問題的遞迴和非遞迴Java實現遞迴Java
- Java不用遞迴的迭代快速排序示例Java遞迴排序
- 漢諾塔非遞迴演算法遞迴演算法
- 遍歷二叉樹-------遞迴&非遞迴二叉樹遞迴
- 演算法學習-遞迴排序演算法遞迴排序
- 二叉樹——後序遍歷的遞迴與非遞迴演算法二叉樹遞迴演算法
- 五大演算法程式碼模板(DFS 遞迴非遞迴都算上,是六個)演算法遞迴
- 【演算法拾遺】二分查詢遞迴非遞迴實現演算法遞迴
- 二叉樹建立及遍歷演算法(遞迴及非遞迴)二叉樹演算法遞迴
- C#中漢諾塔問題的遞迴解法C#遞迴
- 資料結構:歸併排序(非遞迴)資料結構排序遞迴
- Vue3.0的遞迴監聽和非遞迴監聽Vue遞迴
- 遞迴轉非遞迴 棧模擬 Recursive to Non-recursive stack simulated 總結遞迴
- python-動態規劃的遞迴、非遞迴實現Python動態規劃遞迴
- 遞迴和非遞迴分別實現求n的階乘遞迴
- 二叉樹的四種遍歷(遞迴與非遞迴)二叉樹遞迴
- 斐波那契數列的遞迴和非遞迴實現遞迴
- 遞迴和尾遞迴遞迴
- 演算法小專欄:遞迴與尾遞迴演算法遞迴
- 遞迴演算法遞迴演算法