zoukankan      html  css  js  c++  java
  • 快速排序

    简单的了解以下快排:

    参考的讲解网址:https://blog.csdn.net/nrsc272420199/article/details/82587933

    1、稳定性问题     首先大家应该都知道快速排序是一个不稳定排序算法,那么到底什么才是排序的稳定性呢,我认为通俗的讲有两个相同的数A和B,在排序之前A在B的前面,而经过排序之后,B跑到了A的前面,对于这种情况的发生,我们管他叫做排序的不稳定性,而快速排序在对存在相同数进行排序时就有可能发生这种情况。例如(5,3A,6,3B)对这个进行排序,排序之前相同的数3A与3B,A在B的前面,经过排序之后会变成(3B,3A,5,6),所以说快速排序是一个不稳定的排序

    2、时间复杂度问题

    最优情况:每一次的flag刚好都可以平分整个数组,此时的时间复杂度为O(nlogn)

    最坏情况:每一次的flag刚好都是最大或者最小的数,此时的时间复杂度为O(n2)

    平均情况:经过推到平均情况为O(nlogn)

    我的代码:

     1 #include<cstring>
     2 #include<cstdio>
     3 #include<iostream>
     4 #include<algorithm>
     5 using namespace std;
     6 int qksort(int* A,int left,int right)
     7 {
     8     if(left>=right)return 0;
     9     //终止条件是>=的运算符
    10     int p=A[left];
    11     //printf("->>%d
    ",p);
    12     int low=left,high=right;
    13     while(low!=high)
    14     {
    15         while(high>low&&A[high]>=p)high--;
    16         A[low]=A[high];
    17         while(low<high&&A[low]<=p)low++;
    18         A[high]=A[low];
    19         //while判断条件需要格外注意。
    20         //首先要判断的是low与high的大小关系
    21         //其次要注意第二条件中允许了 等于 这一条件,否则遇到相同的数据会死循环
    22     }
    23     A[low]=p;
    24     qksort(A,left,low-1);
    25     qksort(A,low+1,right);
    26     return 0;
    27 }
    28 
    29 int quick_sort(int* A,int* Aend)
    30 {
    31     int lenth=Aend-A;
    32     qksort(A,0,lenth-1);
    33     return 0;
    34 }
    35 
    36 int main()
    37 {
    38     int aim[]={6,69,4,8,3,69,12,63,42};
    39     quick_sort(aim,aim+9);
    40     for(int i=0;i<9;i++)
    41         printf("%d ",aim[i]);
    42     printf("
    ");
    43     return 0;
    44 }

    -----------------------------------------------------------------------------

    下面是第一次补充内容:一个更好一些的模板

     1 int quick_sort(int *aim,int x,int y)
     2 {
     3     //printf("[%d,%d)
    ",x,y);
     4     if(y-x<=1)return 0;//区间是左闭右开
     5     //也许选定的标准数字是最小的或最大的使得下一层递归中没有排序对象
     6     int p=aim[x];//选定最开头的数字为标准数字
     7     int low=x,high=y-1;
     8     while(low!=high)
     9     {
    10         while(low<high&&aim[high]>=p)high--;
    11         aim[low]=aim[high];
    12         while(low<high&&aim[low]<=p)low++;
    13         aim[high]=aim[low];
    14         //比较有规律,建议直接背住
    15     }
    16     aim[low]=p;
    17     for(int i=x;i<y;i++)cout<<aim[i]<<" ";
    18     cout<<endl;
    19     //
    20     quick_sort(aim,x,low);
    21     quick_sort(aim,low+1,y);
    22     return 0;
    23 }

    OK

  • 相关阅读:
    Linux下Tomcat日志分割
    adb logcat 命令使用说明
    linux系统下安装两个或多个tomcat
    架构师小跟班:SSL证书免费申请及部署,解决页面样式错乱问题完整攻略
    springboot获取七牛云空间文件列表及下载功能
    Java使用ganymed工具包执行LINUX命令教程
    Java学生信息管理系统源码
    数据库SQL语句性能优化
    Java开发环境系列:一篇能解决你99%问题的排雷日记
    架构师小跟班:教你从零开始申请和配置七牛云免费OSS对象存储(不能再详细了)
  • 原文地址:https://www.cnblogs.com/savennist/p/12311168.html
Copyright © 2011-2022 走看看