关闭

【排序算法】:九大排序算法总结

直接插入排序参考博客:【排序算法】:直接插入排序 时间复杂度: 平均情况:O(N^2) 最好情况:O(N) 最坏情况:O(N^2) 空间复杂度:O(1) 稳定性:稳定希尔排序参考博客:【排序算法】:希尔排序时间复杂度: 平均情况:O(N^1.3) 最好情况:O(N) 最坏情况:O(N^2) 空间复杂度:O(1) 稳定性:不稳定选择排序参考博客:【排序算法】:选择排序 时间复杂度: 平均情况:...
阅读(98) 评论(0)

【排序算法】:基数排序

定义基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。原理...
阅读(73) 评论(0)

【排序算法】:计数排序

思路: 设被排序的数组为A,排序后存储到B,C为临时数组。所谓计数,首先是通过一个数组C[i]计算大小等于i的元素个数,此过程只需要一次循环遍历就可以;在此基础上,计算小于或者等于i的元素个数,也是一重循环就完成。下一步是关键:逆序循环,从length[A]到1,将A[i]放到B中第C[A[i]]个位置上。原理是:C[A[i]]表示小于等于a[i]的元素个数,正好是A[i]排序后应该在的位置。而且...
阅读(121) 评论(0)

【排序算法】:归并排序

介绍归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。 归并过程为:比较a[i]和b[j]的大小,若a[i]≤b[j],则将第一个有序表中的元素a[i]复制到r[k]中...
阅读(84) 评论(0)

【排序算法】:快速排序

介绍快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。三数取中我们在 进行快速排序时需要把数据划分为两个部分,需要一个key值。为了避免极端情况(key值是最大或最小值–>划分的两...
阅读(128) 评论(0)

【排序算法】:冒泡排序

介绍原理:(升序) 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 针对所有的元素重复以上的步骤,除了最后一个。 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 时间复杂度:O(N^2); 空间复杂度:O(1); 稳定性:稳定代码实现:void BubbleSort...
阅读(70) 评论(1)

【排序算法】:堆排序

介绍堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] >= A[i]。在数组的升序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。思想: 用升序建大堆,降序建小堆。(我...
阅读(77) 评论(0)

【排序算法】:选择排序

介绍选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)。平均时间复杂度:O(n2) 空间复杂度:O(1) (用于交换和记录索引) 稳定...
阅读(94) 评论(0)

【排序算法】:希尔排序

介绍希尔排序是一种插入排序算法,它出自D.L.Shell,因此而得名。Shell排序又称作缩小增量排序。原理图: 思想:先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2代码实现void ShellSort(int* arr, int len) { assert(arr);...
阅读(109) 评论(0)

【排序算法】:直接插入排序

介绍思想:每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。 实现原理:第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从后向前扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。 时间复杂度:O(N^2); 空间复杂度:O(1); 稳定性:稳定;代码实现代码实现://直接插入排序...
阅读(69) 评论(0)

C++智能指针(三):weak_ptr--解决shared_ptr循环引用问题

weak_ptr--解决shared_ptr循环引用问题 我们在上篇博客讲了模拟实现三种智能指针:模拟实现三种智能指针循环引用但是我们说了,shared_ptr存在循环引用的问题。我们先介绍一下什么是shared_ptr的循环引用。我们知道,智能指针shared_ptr采用的是引用计数的方式,下面我们来写一个双向链表。#include...
阅读(152) 评论(0)

C++智能指针(二):模拟实现三种智能指针

上一篇博客我们简单介绍了智能指针:简单介绍智能指针有关shared_ptr的循环引用问题可以参考博客:weak_ptr–解决shared_ptr循环引用问题auto_ptr模拟实现template class Autoptr { public: Autoptr(T* ptr = NULL) :_ptr(ptr) {} Autoptr(Autop...
阅读(121) 评论(0)

C++智能指针(一):智能指针的简单介绍

智能指针的简单介绍,RAII,auto_ptr,scoped_ptr(boost) unique_ptr(c++11) 防拷贝 –简单粗暴的设计 ,3.shared_ptr(boost/c++11) 引用计数 –功能强大(支持拷贝,支持定制删除器) 缺陷–循环引用(可采用weak_ptr配合解决 RAII定义RAII(Resource Acquisition Is Initialization),也称为“资源获取就是...
阅读(70) 评论(0)

C/C++内存管理:malloc/calloc/realloc区别和联系

malloc/calloc/realloc区别和联系。用法详解 头文件它们三个头文件均为:#include 函数原型mallocvoid *malloc(size_t size);void* 表示未确定类型的指针,void *可以指向任何类型的数据. **参数:**size为需要内存空间的长度. 返回值:成功返回系统分配的地址,失败返回NULL。callocvoid *calloc(si...
阅读(72) 评论(0)

详解初始化列表

初始化列表定义构造函数有个特殊的初始化方式叫“初始化表达式表”(简称初始化列表)。初始化列表位于函数参数表之后,却在函数体 {} 之前。这说明该表里的初始化工作发生在函数体内的任何代码被执行之前。Date(int year, int month, int day)//带参构造函数 :_year(year) , _month(month) , _day(...
阅读(88) 评论(0)
103条 共7页1 2 3 4 5 ... 下一页 尾页
    个人资料
    • 访问:36051次
    • 积分:1350
    • 等级:
    • 排名:千里之外
    • 原创:103篇
    • 转载:0篇
    • 译文:0篇
    • 评论:4条
    博客专栏