热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于快排的递归实现

关于快排的递归实现*--关于快排的递归实现TableofContents1引子2源码

关于快排的递归实现

Table of Contents

  • 1 引子
  • 2 源码

1 引子

自己以前写过一篇关于快速排序的blog,但是没采用递归,而且当时的blog是完全手写的.但是现在都用Emacs工作,所以就分开了.

虽然以前写过快排,但是过了一段时间再来写,虽然有递归的引子,但还是对递归的初始入口不会,始终不得其解,还是在参看了以前的代码才写了出来.

2 源码

快速排序的递归实现:

 1:  #include 
 2:  #include 
 3:  
 4:  /**
 5:    * 根据哨兵对数组进行划分,左小右大
 6:    * @param num   int*   待排序数组
 7:    * @param start int    待排序数组的起点
 8:    * @param end   int    待排序数组的终点
 9:    *
10:    * @return  int    进行完一次划分后,所选哨兵在数组中所在的索引,用来划分数组,左小右大
11:    */
12:  int quicksort(int* num,int start,int end)
13:  {
14:    int i = start,j = end;
15:    int temp = num[start]; //每次的哨兵选择待排序数组的第一个数
16:    while(i 17:    {
18:        while(num[j] > temp && j > i)
19:            j--;
20:        if(j > i)
21:            num[i++] = num[j];
22:        while(num[i]  i)
23:            i++;
24:        if(j > i)
25:        num[j--] = num[i];
26:    }
27:    num[i] = temp;
28:    return i; //哨兵的索引
29:  }
30:  
31:  /**
32:    * 递归调用实现排序
33:    * @param 同quicksort
34:    *
35:    */
36:  int sort(int* num,int start,int end)
37:  {
38:    int index;
39:    if(start //注意递归的入口
40:    {
41:        index = quicksort(num,start,end);
42:        sort(num,start,index-1);
43:        sort(num,index+1,end);
44:    }
45:    return 0;
46:  }
47:  
48:  int main()
49:  {
50:    int i,num[10] = {1,4,2,56,32,67,43,87,96,11};
51:  
52:    sort(num,0,9);
53:  
54:    for(i = 0; i <10; i++)
55:        printf("%d ",num[i]);
56:    return 0;
57:  }

平均时间复杂度:O(nlog(n));

Date: 2014-08-25 Mon

Author: Chen Jingran

Org version 7.8.11 with Emacs version 24

Validate XHTML 1.0

推荐阅读
  • 在2021-2022 ACM集训队月度编程挑战赛第二轮中,题目“最大值与最小值的选择”要求参赛者处理一个包含n个元素的数组,并给定一个整数k。任务是通过选择特定的子数组,计算并返回这些子数组的最大值和最小值之间的差值。该问题考验了选手对数组操作和优化算法的理解与应用能力。 ... [详细]
  • 题目:图像处理(HDU1828,计算周长并集,利用线段树与离散化技术进行扫描) ... [详细]
  • 本文详细探讨了OpenCV中人脸检测算法的实现原理与代码结构。通过分析核心函数和关键步骤,揭示了OpenCV如何高效地进行人脸检测。文章不仅提供了代码示例,还深入解释了算法背后的数学模型和优化技巧,为开发者提供了全面的理解和实用的参考。 ... [详细]
  • 在多堆石子游戏中,通过分析Nim博弈策略,探讨了如何在限定时间和内存条件下实现最优解。本文详细研究了石子游戏中的数学原理和算法优化方法,旨在为参与者提供有效的策略指导。具体而言,文章讨论了不同堆数下的Nim值计算及其应用,帮助玩家在复杂的博弈环境中取得优势。 ... [详细]
  • 本文深入解析了计算机科学领域中常用的几种排序算法,包括冒泡排序、插入排序、选择排序和希尔排序。通过对这些算法的性能进行详细对比分析,探讨了它们在不同数据规模和分布情况下的优劣。研究结果表明,冒泡排序虽然实现简单,但在大多数情况下效率较低;插入排序在部分有序的数据集中表现较好;选择排序的时间复杂度较为稳定,但空间复杂度较高;而希尔排序通过引入增量序列显著提高了排序效率,适用于大规模数据集。 ... [详细]
  • C++ STL 常见函数应用详解与实例解析
    本文详细解析了 C++ STL 中常见函数的应用,并通过具体实例进行说明。特别地,文章对迭代器(iterator)的概念进行了深入探讨,将其视为一种将迭代操作抽象化的工具,便于在不同容器间进行元素访问和操作。此外,还介绍了迭代器的基本类型、使用方法及其在算法中的应用,为读者提供了丰富的实践指导。 ... [详细]
  • 在处理UVA11987问题时,关键在于实现并查集结构以支持删除操作。特别地,当需要删除某个节点时,如果该节点不是根节点,则处理相对简单;然而,若删除的是根节点,则需要进行额外的处理来维护集合的连通性。本文将详细介绍如何通过优化并查集算法,确保在删除根节点时仍能高效地维护数据结构的完整性和查询效率。 ... [详细]
  • Prim算法在处理稠密图时表现出色,尤其适用于边数远多于顶点数的情形。传统实现的时间复杂度为 \(O(n^2)\),但通过引入优先队列进行优化,可以在点数为 \(m\)、边数为 \(n\) 的情况下显著降低时间复杂度,提高算法效率。这种优化方法不仅能够加速最小生成树的构建过程,还能在大规模数据集上保持良好的性能表现。 ... [详细]
  • 计算 n 叉树中各节点子树的叶节点数量分析 ... [详细]
  • [TyvjP1050] 动态规划求解最长公共子序列问题
    在解决最长公共子序列问题时,动态规划是一种高效的方法。具体而言,我们使用二维数组 `dp[i][j]` 来表示第一个字符串匹配到第 `i` 位,第二个字符串匹配到第 `j` 位时的最长公共子序列长度。状态转移方程为:当两个字符相等时,`dp[i][j] = dp[i-1][j-1] + 1`;否则,`dp[i][j] = max(dp[i-1][j], dp[i][j-1])`。通过这种方法,我们可以有效地计算出两个字符串的最长公共子序列。 ... [详细]
  • 在进行网络编程时,准确获取本地主机的IP地址是一项基本但重要的任务。Winsock作为20世纪90年代初由Microsoft与多家公司共同制定的Windows平台网络编程接口,为开发者提供了一套高效且易用的工具。通过Winsock,开发者可以轻松实现网络通信功能,并准确获取本地主机的IP地址,从而确保应用程序在网络环境中的稳定运行。此外,了解Winsock的工作原理及其API函数的使用方法,有助于提高开发效率和代码质量。 ... [详细]
  • 结语 | 《探索二进制世界:软件安全与逆向分析》读书笔记:深入理解二进制代码的逆向工程方法
    结语 | 《探索二进制世界:软件安全与逆向分析》读书笔记:深入理解二进制代码的逆向工程方法 ... [详细]
  • BZOJ 1835: 基站位置选择问题(动态规划与线段树优化) ... [详细]
  • 本次发布的Qt音乐播放器2.0版本在用户界面方面进行了细致优化,提升了整体的视觉效果和用户体验。尽管核心功能与1.0版本保持一致,但界面的改进使得操作更加直观便捷,为用户带来了更为流畅的使用体验。此外,我们还对部分细节进行了微调,以确保软件的稳定性和性能得到进一步提升。 ... [详细]
  • 从零起步:使用IntelliJ IDEA搭建Spring Boot应用的详细指南
    从零起步:使用IntelliJ IDEA搭建Spring Boot应用的详细指南 ... [详细]
author-avatar
带上耳机全世界跟我8没关系
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有