zoukankan      html  css  js  c++  java
  • 图解数据结构---快速排序(存疑)

    参考:https://mp.weixin.qq.com/s?__biz=MzUyNjQxNjYyMg==&mid=2247483963&idx=1&sn=dd58fafb86a43eec3dcdc2a2def8fcb7&scene=19#wechat_redirect

    • 快速排序(C语言版 ):时间复杂度=n log n ,空间复杂度:log n

      算法步骤:

    1. 从数列中挑出一个元素,称为 “基准”(pivot);

    2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;

    3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;

      算法演示:

      

      代码:

      首先是严蔚敏,严奶奶的标准分割函数:(看读懂其中的那两句A[low] = A [high]  和A[high] = A [low],这样执行完第一句A[low]不会改变吗,之后进行寻找大于pivot的时候难道不会跳过某个数吗?。。。)

      

      然后是自己写的。。。

     1 int Parititionl(int *A,int low,int high){
     2     //确定基准位置为当前low值
     3     int pivot = *( A + low);
     4     //将首元素(基准)暂存
     5     int *temp = A + low;
     6     //当low与high相差一时(即当前集合只存在两个数,此时直接判断大小交换即可)
     7     if (low +1 == high) {
     8         if(A[low] > A[high])
     9             swap(A+low,A+high);
    10         else return low;
    11         //当low与high相等时(即当前集合只有1个数)无需交换
    12     } else if (low == high) {
    13         return low;
    14         //当上述两个条件不满足时,low值加一(因为low未加一前为基准pivot,该值不参与交换,加1后的low~high之间进行交换)
    15     } else low +=1;
    16     //在low游标不超过high的前提下进行(相碰时证明当前轮结束)
    17     while (low < high){
    18         //高位小于基准时(寻找小于基准pivot的数)。
    19         while (low < high && A[high] >= pivot)
    20             --high;
    21         //低位大于基准时(寻找大于基准pivot的数)。
    22         while (low < high && A[low] <= pivot)
    23             ++low;
    24         //low大于等于基准,high小于等于基准时,二者交换
    25         swap(A+low,A+high);
    26     }
    27     //low等于high时,将暂存的基准temp与low交换,也可以与high交换(此时,low与high二者相等)
    28         swap(temp,A+low);
    29     return low;
    30 }
    31 
    32 void QuickSort(int *A ,int low, int high){
    33     if (low < high ){
    34         //将数组分为左右两部分
    35         int pivot = Parititionl(A ,low ,high);
    36         //左部分递归
    37         QuickSort(A,low,pivot-1);
    38         //右部分递归
    39         QuickSort(A,pivot+1,high);
    40     }
    View Code
  • 相关阅读:
    085_JS Promise
    086_Service Cloud
    081_Introducing trigger handler class
    080_Dataloader.io
    Veeva_001常见问题总结
    UML 组成 1
    078_Sublime HaoIDE 搭建 Lightning Aura环境
    075_解密加密
    074_Wrapper_Class
    073_SFDC Limit
  • 原文地址:https://www.cnblogs.com/BANLOONG/p/10582006.html
Copyright © 2011-2022 走看看