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

    既然写了归并排序,那就让我来写一些快速排序

    快速排序

    虽然它叫快速排序,但是它并没有想象里那么快,快速排序的最差时间复杂度和冒泡排序是一样的都是O(N2),它的平均时间复杂度为O(NlogN)。然而归并排序的平均时间复杂度为O(NlogN)。

    下面是一个非常形象的图解

    首先,有一组数,上面有哨兵i和哨兵j,两个哨兵分别从数列的最左端和最右端出发,选择第一个数为基准数,哨兵j要找小于6的数,而哨兵i要找大于6的数。(注意:一定要j先找,不然的话会很惨的)

    这个时候,哨兵i和j都找到了自己要找的数,就把它们找到的数交换

    交换后,两个哨兵继续向前走

    这个时候他们又找到了各自要找的数,就继续交换

    交换后,继续进行

    这个时候,我们发现,哨兵i和j相遇了,这个时候,我们把基准数和他们相遇的数进行交换

    这个时候,就会发现,基准数6,已经归位了

    之后,我们就可以按照同样的方法,分别把6左右的数列进行排序,最后就可以得到一个有序数列了

    上图是一个总结

    OK!代码如下:

     1 #include<iostream>
     2 #include<cmath>
     3 using namespace std;
     4 int data[1000];
     5 void qsort(int left, int right){
     6     if (left > right) return;    //结束 
     7     int temp=data[left];        //temp是基准数 
     8     int i=left;
     9     int j=right;
    10     while (i != j){
    11         while (data[j]>=temp && i<j)    //右区间找比基准数大的数 
    12             j--;
    13         while (data[i]<=temp && i<j)    //左区间找比基准数小的数 
    14             i++;
    15         if (i<j) swap(data[i],data[j]);    //一次寻找结束,交换两个数 
    16     }
    17     swap(data[left],data[i]);            //基准数归位 
    18     qsort(left,i-1);                    //递归 
    19     qsort(i+1,right);
    20 }
    21 int main()
    22 {
    23     int n;
    24     cin>>n;
    25     for (int i=1; i<=n; i++)
    26         cin>>data[i];
    27     qsort(1, n);
    28     for (int i=1; i<=n; i++)
    29         cout<<data[i]<<" ";
    30 }
  • 相关阅读:
    sql去重复
    验证 decimal 和 数字
    OleDbConnection读取Excel
    排班知识点
    sql基础
    SQL Server 获取月份的具体天数
    2016 Excel 展示 Sqlserver数据并制作图表
    SQL Server跨域查询
    SqlSugar中CASE WHEN的用法
    Microsoft.AspNetCore.Mvc.Versioning学习笔记
  • 原文地址:https://www.cnblogs.com/Alan-Anders/p/10573527.html
Copyright © 2011-2022 走看看