快速排序的递归和非递归
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
快速排序的递归和⾮递归
快速排序,顾名思义,是⼀种速度快,效率⾼的排序算法。
快排原理:
在要排的数(⽐如数组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
递归:
public static void sort(int a[], int low, int hight) {
int i, j, index;
if (low > hight) {
return;
}
i = low;
j = hight;
index = a[i]; // ⽤⼦表的第⼀个记录做基准
while (i < j) { // 从表的两端交替向中间扫描
while (i < j && a[j] >= index)
j--;
if (i < j)
a[i++] = a[j];// ⽤⽐基准⼩的记录替换低位记录
while (i < j && a[i] < index)
i++;
if (i < j) // ⽤⽐基准⼤的记录替换⾼位记录
a[j--] = a[i];
}
a[i] = index;// 将基准数值替换回 a[i]
sort(a, low, i - 1); // 对低⼦表进⾏递归排序
sort(a, i + 1, hight); // 对⾼⼦表进⾏递归排序
⾮递归:
1package剑指offer.快速排序;
2
3import java.util.Stack;
4
5/**
6 * Created by nick on 2018/10/6.
7 * ⾮递归
8*/
9public class Solution {
10public static void main(String[] args) {
11int[] m={5,3,6,3,2,9};
12new Solution1().QiockSortNor(m,0,5);
13for(int t:m)
14 System.out.println(t);
15 }
16//⼀趟快速排序
17int sort(int m[],int i,int j){
18int x=m[i];
19while (i<j) {//⼀次不⾏,进⾏多次
20while (i < j && m[j] >= x)//从右向左,找⽐x⼩的
21 j--;
22if (i < j) {
23 m[i] = m[j];
24 i++;
25 }
26while (i < j && m[i] <= x)//从左向右,找⽐x⼤的
27 i++;
28if (i < j) {
29 m[j] = m[i];
30 j--;
31 }
32 m[i] = x;
33 }
34return i;
35 }
36void QiockSortNor(int num[],int low,int high)
37 {
38 Stack<Integer> st=new Stack<Integer>();
39if(low<high)
40 {
41int mid =sort(num,low,high);
42if(low<mid-1){//找到中间的数之后,左右边界⼊栈
43 st.push(low);
44 st.push(mid-1);
45 }
46if(mid+1<high){
47 st.push(mid+1);
48 st.push(high);
49 }
50while(!st.empty()){//将左右边界出栈之后进⾏下⼀次排序操作,直到所有的元素全部出栈,没有还在栈⾥⾯的元素51int q=st.pop();//右边界
52int p=st.pop();//左边界
53 mid=sort(num,p,q);
54if(p<mid-1)
55 {
56 st.push(p);
57 st.push(mid-1);
58 }
59if(mid+1<q)
60 {
61 st.push(mid+1);
62 st.push(q);
63 }
64 }
65 }
66 }
67
68 }。