排序算法(1) 快速排序 C++实现

快速排序基本特性

  1. 时间复杂度:O(n*lgn)
  2. 最坏:O(n^2)
  3. 空间复杂度:最好情况下:O(lgn),最坏情况:O(n),平均情况:O(lgn)
  4. 不稳定。

关于快速排序的空间复杂度,谢谢@命运他爹 同学指正。详述一下。

快速排序由于每次递归的时候会占用一个空间返回中间数位置,所以一次递归的空间复杂度为O(1)。

最好情况和平均情况下的递归深度为O(lgn),相应的空间复杂度就是O(lgn)

最坏情况下的递归深度为O(n),空间复杂度为O(n)。

算法

QUICKSORT(A, p, r)
    if p < r
       then q ← PARTITION(A, p, r)  //关键
            QUICKSORT(A, p, q - 1)
            QUICKSORT(A, q + 1, r)
PARTITION(A, p, r)
      x ← A[r]
      i ← p - 1
      for j ← p to r - 1
           do if A[j] ≤ x
                 then i ← i + 1
                     exchange A[i] <-> A[j]
      exchange A[i + 1] <-> A[r]
      return i + 1

示例

 

待排序数组:7  3  5  9  8  5  1  10  4  6

源码类声明
class BaseSort {
public:BaseSort() { }virtual void sort() = 0;
};class QuickSort : public BaseSort {
public:QuickSort(int Array[], int len) : BaseSort() {this->Array = Array;this->len = len;}void sort();
private:int partition(int Array[], int start, int end);void quicksort(int Array[], int start, int end);
private:int* Array;int len;
};
////相关成员函数实现void QuickSort::sort() {quicksort(Array, 0, len-1);
}void QuickSort::quicksort(int Array[], int start, int end) {if ( start < end ) {int mid = this->partition(Array, start, end);if ( start < mid - 1 )quicksort(Array, start, mid-1 );if ( mid + 1 < end )quicksort(Array, mid+1, end);}
}int QuickSort::partition(int Array[], int start, int end) {int i, j, x, tmp;x = Array[end];i = start -1;for ( j = start; j < end; j++ ) {if ( Array[j] <= x) {i++;tmp = Array[j];Array[j] = Array[i];Array[i] = tmp;}}tmp = Array[end];Array[end] = Array[i+1];Array[i+1] = tmp;//if (DEBUG) {//    printArray(Array, len, "MidResult:");//}return i+1;
}
测试:int main(int argc, char* argv[])
{//printf("Hello World!\n");int a[10] = {7,3,2,9,8,5,1,10,4,6};int len = 10;QuickSort* quicksort= new QuickSort(a, len);quicksort->sort();printArray(a, len, "QuickSort:");system("pause");//用于暂停return 0;
}

 

转载于:https://www.cnblogs.com/rinack/p/4294162.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/376214.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

boost 变量类型转换

如果vs版本比较低&#xff0c;会不支持一些std类型转换函数&#xff08;vs2008就不支持&#xff09;&#xff0c;比如&#xff1a; std::to_string \\数字转字符串 std::stoll \\字符串转数字而且项目碰巧用boost库&#xff0c;可以考虑用下面的的方法来进行类型转换…

PB增删改

新建一个数据窗口----选择需要更新的表&#xff0c;或者直接写sql也可以如下图已经建立好的数据窗口&#xff0c;根据要求将需要更新的列、unigue key 还有需要更新的表设置好&#xff0c;【将需要更新列的taborder设置大于0 这样维护的时候可以编辑&#xff08;等于0是不能编辑…

(五十六)iOS多线程之NSOperation

NSOpertation是一套OC的API&#xff0c;是对GCD进行的Cocoa抽象。 NSOperation有两种不同类型的队列&#xff0c;主队列和自定义队列。 主队列运行于主线程上&#xff0c;自定义队列在后台运行。 【NSBlockOperation】 通过Block创建任务&#xff0c;下面比较主队列和自定义队列…

android 系统源码调试 局部变量值_如何方便快速的整编Android 9.0系统源码?

点击上方“刘望舒”&#xff0c;选择“星标”多点在看&#xff0c;就是真爱&#xff01;作者 : 刘望舒 | 来源 &#xff1a;刘望舒的博客地址&#xff1a;http://liuwangshu.cn/framework/aosp/3-compiling-aosp.html前言在上一篇文章是时候下载Android 9.0系统源码了中&…

boost 文件操作

如果要简单处理文件和文件夹的时候&#xff08;删除、重命名等&#xff09;&#xff0c;使用Windows的系统函数会十分麻烦&#xff0c;可以尝试一下使用Boost库来进行处理 头文件 #include <boost/filesystem.hpp>如果要获得每次处理的结果错误码&#xff0c;需要加上头…

让“是男人就下到100层”在Android平台上跑起来

原工程:https://github.com/jeekun/DownFloors 移植后的代码&#xff1a;HelloCpp.zip 移植后的APK&#xff1a;HelloCpp.apk 说明&#xff1a;&#xff08;cocos2d-x版本是“ 2.2&#xff09; 1.该工程是直接在HelloCpp上修改完成,所以包名也不修改了 2.原工程里面可能是采用g…

Codeforces Round #277 (Div. 2) 题解

Codeforces Round #277 (Div. 2)A. Calculating Functiontime limit per test1 secondmemory limit per test256 megabytesinputstandard inputoutputstandard outputFor a positive integer n lets define a function f: f(n)   - 1  2 - 3  ..  ( - 1)nn Your …

QT 边框圆角处理

平时的边框是平角的&#xff1a; 如果需要圆角的话&#xff0c;就要加stylesheet加上这个&#xff1a; border-radius:3px;比如&#xff1a; QPushButton{ border-radius:3px; }就变成圆角了&#xff1a; px前面的数字越大就越圆&#xff0c;比如5px比3px圆 假如只需要某一…

3级调度 fpga_Vivado HLS学习笔记——1.了解FPGA架构

本篇文章为本人学习Xilinx的Vivado HLS教程记录的学习笔记&#xff0c;仅供学习参考。Vivado HLS官方视频教程&#xff1a;优酷视频​v.youku.com目录&#xff1a; Vivado HLS课程简介FPGA与CPU、GPU、DSP的区别FPGA的优势Xilinx FPGA架构:逻辑单元、算术逻辑单元、存储单元使用…

[LeetCode]Maximum Depth of Binary Tree

Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the longest path from the root node down to the farthest leaf node. 思考&#xff1a;DFS。 /*** Definition for binary tree* struct TreeNode {* int val;* Tree…

BZOJ2435 [Noi2011]道路修建

这是NOI11年题&#xff0c;你在逗我&#xff1f; 直接dfs就可以了&#xff0c;Linux下貌似不会爆栈。。。 1 /**************************************************************2 Problem: 24353 User: rausen4 Language: C5 Result: Accepted6 Time:5184 …

Qt异常结束程序无法重新运行

有时候代码有问题会导致qt异常结束 修改完后重新运行又会出现 查看任务管理器又没有这个进程 可以使用资源管理器打开看看 也可以考虑使用process explorer查看 发现程序挂起来&#xff0c;结束掉它就可以重新运行了

hadooppythonsql_半小时搞定Hadoop+Mysql+Hive+Python

1. 说明搭建过Hadoop集群的小伙伴一定知道&#xff0c;如果不用docker&#xff0c;半小时配好HadoopMysqlHive(后简称Hive)肯定是胡吹&#xff0c;有了Docker镜像&#xff0c;没有说明文档&#xff0c;配好了也不一定会用。本文将介绍如何在半小时内&#xff0c;让Hive在你的Li…

PHP 切割字符串 点号 不用双斜杠

$name "tupian.png"; $nameArr explode(".", $name); 习惯了Java的程序员容易写成 $nameArr explode("\\.", $name);//在PHP中是不正确的转载于:https://www.cnblogs.com/wuyou/p/3463425.html

Qt新添加的类无法链接

通过这个方法给工程添加了个类&#xff1a; 编译的时候就出现了这个问题&#xff1a; 执行一下qmake 然后再重新构建项目就可以了

URAL 1830 Help in the RNOS 思路,读题 难度:1

http://acm.timus.ru/problem.aspx?space1&num1830 这道题需要理解题目操作的意思, 要更改第i位的状态,第i-1位必须激活为1,0-i-2位必须为0,如果0-i-1位开始时全为0,那么从0位开始进行操作 一.首先考虑对于0-i-1位都是0,需要更改i位的情况,需要 1.更改i-1位,2.按一下打开下…

openssh升级sftp_OpenSSH 8.2 发布 包括 sftp 客户端和服务器支持

OpenSSH 8.2 发布了。OpenSSH 是 100% 完整的 SSH 协议 2.0 版本的实现&#xff0c;并且包括 sftp 客户端和服务器支持。此版本变化不少&#xff0c;其中有两个地方值得特别关注。一个是新特性&#xff0c;此版本增加了对 FIDO/U2F 硬件身份验证器的支持。FIDO/U2F 是廉价硬件双…

任务队列摘自新锋

在开发C程序时&#xff0c;一般在吞吐量、并发、实时性上有较高的要求。设计C程序时&#xff0c;总结起来可以从如下几点提高效率&#xff1a; l 并发l 异步l 缓存下面将我平常工作中遇到一些问题例举一二&#xff0c;其设计思想无非以上三点。 1任务队列 1.1 以生产者-消…

C++容器遍历时删除元素

vector 错误做法 这样做会在遍历过程中越界导致程序崩溃 std::vector<int> vecInt({ 1, 3, 2, 1, 4, 1 });for (auto i vecInt.begin(); i ! vecInt.end() ; i) {if (*i 1) {vecInt.erase(i);}}正确做法 std::vector<int> vecInt({ 1, 3, 2, 1, 4, 1 });for (a…

按钮图片拉伸_图片墙有多香?高手都在用的PPT封面制作技巧!

大家好&#xff0c;我是李导~这次&#xff0c;冬天是真的来了&#xff0c;不知道大家有没有感觉&#xff0c;每次冷空气真正袭来之前我们都会以为今年是个暖冬&#xff0c;结果突然有一天气温从20度直降到个位数&#xff0c;我们都会认为今年比以往的冬天都冷。但是&#xff0c…