zoukankan      html  css  js  c++  java
  • 快速排序的递归和非递归

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

    • 快排原理:
            在要排的数(比如数组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 }
  • 相关阅读:
    简化异步操作(上):使用CCR和AsyncEnumerator简化异步操作
    CentOS 6.3(x32)下安装Oracle 10g R2
    Linux Oracle服务启动&停止脚本与开机自启动
    简化异步操作(上):使用CCR和AsyncEnumerator简化异步操作
    日记 20130202 阴
    2020年8月16日
    2020年8月18日
    2020年8月15日
    2020年8月22日
    2020年8月19日
  • 原文地址:https://www.cnblogs.com/nickup/p/9748188.html
Copyright © 2011-2022 走看看