您的位置:首页 > 编程语言 > Java开发

[算法入门]快速排序非递归方法(Java实现),大家一起来找茬啊~

2017-01-09 17:06 633 查看

基础

总结一下,快速排序的步骤:

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息