快速排序的递归和非递归
Posted nickup
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速排序的递归和非递归相关的知识,希望对你有一定的参考价值。
快速排序,顾名思义,是一种速度快,效率高的排序算法。
- 快排原理:
在要排的数(比如数组A)中选择一个中心值key(比如A[0]),通过一趟排序将数组A分成两部分,其中以key为中心,key右边都比key大,key左边的都key小,然后对这两部分分别重复这个过程,直到整个有序。
整个快排的过程就简化为了一趟排序的过程,然后递归调用就行了。
一趟排序的方法:
1定义i=0,j=A.lenght-1,i为第一个数的下标,j为最后一个数下标
2从数组的最后一个数Aj从右往左找,找到第一小于key的数,记为Aj;
3从数组的第一个数Ai 从左往右找,找到第一个大于key的数,记为Ai;
4交换Ai 和Aj
5重复这个过程,直到 i=j
6调整key的位置,把A[i] 和key交换
假设要排的数组为:A[8] ={ 5 2 8 9 2 3 4 9 }:
选择 key = 5, 开始时 i=0,j=7
index 0 1 2 3 4 5 6 7
开始: 5 2 8 9 2 3 4 9
i j
第一次找 5 2 8 9 2 3 4 9
i j
交换: 5 2 4 9 2 3 8 9
i j
第二次找 5 2 4 9 2 3 8 9
i j
交换: 5 2 4 3 2 9 8 9
i j
第三次找 5 2 4 3 2 9 8 9
ij
调整key: 2 5 4 3 5 9 8 9
ij
--------------------- 本文来自 Yexiaofen 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/Yexiaofen/article/details/78018204?utm_source=copy
递归:
void quick_sort(int m[],int l,int r){ int i=l,j=r; int x=m[i]; if(l<r){ while (i<j) {//一次不行,进行多次 while (i < j && m[j] >= x)//从右向左,找比x小的 j--; if (i < j) { m[i] = m[j]; i++; } while (i < j && m[i] <= x)//从左向右,找比x大的 i++; if (i < j) { m[j] = m[i]; j--; } m[i] = x; } quick_sort(m,l,i-1);//递归调用 quick_sort(m,i+1,r); } }
以上是关于快速排序的递归和非递归的主要内容,如果未能解决你的问题,请参考以下文章