今天想到一個問題,我記得《劍指offer》這本書里面說過:遞歸都可以轉(zhuǎn)換成循環(huán)。那么怎么用循環(huán)來實現(xiàn)快速排序,我迄今為止看到的所有快速排序都是用的遞歸,于我試著寫,想了半個小時居然一點頭緒都沒有。
有哪位大大能夠?qū)懷h(huán)實現(xiàn)的,想開開眼界
歡迎選擇我的課程,讓我們一起見證您的進步~~
用棧儲存,對著改就好了
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/
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;
}
}
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號