快速排序的递归和非递归

快速排序,顾名思义,是一种速度快,效率高的排序算法。

  • 快排原理:
        在要排的数(比如数组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 

递归:

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); // 对高子表进行递归排序

}
---------------------
作者:jianyuerensheng
来源:CSDN
原文:https://blog.csdn.net/jianyuerensheng/article/details/51258374
版权声明:本文为博主原创文章,转载请附上博文链接!

 

非递归:

 1 package 剑指offer.快速排序;
 2 
 3 import java.util.Stack;
 4 
 5 /**
 6  * Created by nick on 2018/10/6.
 7  * 非递归
 8  */
 9 public class Solution {
10     public static void main(String[] args) {
11         int[] m={5,3,6,3,2,9};
12         new Solution1().QiockSortNor(m,0,5);
13         for(int t:m)
14             System.out.println(t);
15     }
16     //一趟快速排序
17     int sort(int m[],int i,int j){
18         int x=m[i];
19             while (i<j) {//一次不行,进行多次
20                 while (i < j && m[j] >= x)//从右向左,找比x小的
21                     j--;
22                 if (i < j) {
23                     m[i] = m[j];
24                     i++;
25                 }
26                 while (i < j && m[i] <= x)//从左向右,找比x大的
27                     i++;
28                 if (i < j) {
29                     m[j] = m[i];
30                     j--;
31                 }
32                 m[i] = x;
33             }
34         return i;
35     }
36     void QiockSortNor(int num[],int low,int high)
37     {
38         Stack<Integer> st=new Stack<Integer>();
39         if(low<high)
40         {
41             int mid =sort(num,low,high);
42             if(low<mid-1){//找到中间的数之后,左右边界入栈
43                 st.push(low);
44                 st.push(mid-1);
45             }
46             if(mid+1<high){
47                 st.push(mid+1);
48                 st.push(high);
49             }
50             while(!st.empty()){//将左右边界出栈之后进行下一次排序操作,直到所有的元素全部出栈,没有还在栈里面的元素
51                 int q=st.pop();//右边界
52                 int p=st.pop();//左边界
53                 mid=sort(num,p,q);
54                 if(p<mid-1)
55                 {
56                     st.push(p);
57                     st.push(mid-1);
58                 }
59                 if(mid+1<q)
60                 {
61                     st.push(mid+1);
62                     st.push(q);
63                 }
64             }
65         }
66     }
67 
68 }

 

posted @ 2018-10-06 19:37  思考的胖头鱼  阅读(1375)  评论(0编辑  收藏  举报