1. 程式人生 > >[演算法入門]快速排序非遞迴方法(Java實現),大家一起來找茬啊~

[演算法入門]快速排序非遞迴方法(Java實現),大家一起來找茬啊~

基礎

總結一下,快速排序的步驟:
1、找到一個key值(就是陣列第一個值),先從右到左找,找到一個比它小的值,記錄下標。
2、然後從左往右找,找到一個比它大的值,記錄下標。
3、交換找到的兩個數字。
4、繼續,直到從右往左找的數字和從左往右找的數字下標重合。交換key值和重合值。
5、這時key值左邊就全是比它小的數字,key值右邊全是比它大的數字。
6、以key值為基準,將陣列分為兩段,左邊和右邊重新進行以上5步。

所以在程式中每次迴圈我們需要記錄的值有:
1、從右往左找時,比key值大的下標
2、從左往右找時,比key值小的下標
3、key值
4、將陣列分段後,每段的最小下標和最大下標。

對於第4點,因為java中有現在堆疊這種資料結構,好了,不選了,就用它來儲存。下面直接貼上原始碼。

public int[] quickSort_not_recursion(int[] result) {
        int i;
        int j;
        int min;    // Every loop's max index
        int max;    // Every loop's minus index
        int key;

        Stack<Integer> conditions = new Stack<Integer>();   // Record the minus index and the max index
conditions.push(0); conditions.push(result.length-1); int temp; // In every loop will get a left index and right index. while(!conditions.empty()){ max = conditions.pop(); min = conditions.pop(); key = result[min]; i = min
+1; j = max; // With this step, the numbers can be divided to 2 sections, // the left side is smaller than the key value, // the right side is bigger than the key value. while(i<j) { // Get the number's index which is smaller than key while (key < result[j] && i<j) { j--; } // Get the number's index which is bigger than key while (key > result[i] && i<j) { i++; } // Swap temp = result[j]; result[j] = result[i]; result[i] = temp; } // Swap the key and i(or j) if(key>result[i]){ temp = result[min]; result[min] = result[j]; result[j] = temp; } // Store the left side minus index and the max index if(min<i-1){ conditions.push(min); conditions.push(i-1); } // Store the right side minus index and the max index if(max>i+1){ conditions.push(i+1); conditions.push(max); } } return result; }