
数据结构
杜Xinyu
明明可以靠脸吃饭,却非要靠才华
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
c++多态(一)——多态的构成条件
多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Child\Adult继承了Person。 Adult对象买票全价,Child对象买票半价。那么在继承中要构成多态还有两个条件:必须通过基类的指针或者引用调用虚函数被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写class Person{public: virtual void BuyTicket() {}};class Child :public Person{public: void BuyT原创 2020-07-10 11:48:09 · 528 阅读 · 0 评论 -
c++继承(九)——继承和组合
继承是is-a的关系,就是每一个派生类的对象都是一个基类对象class A{};class B :public A{};组合是一种has-a的关系。假设B组合了A,每个B对象中都有一个A对象。class A{};class B{ public: A a;};继承允许你根据基类的实现来定义派生类的实现。这种通过生成派生类的复用通常被称为白箱复用 术语“白箱”是相对可视性而言:在继承方式中,基类的内部细节对子类可见 。 继承一定程度破坏了基类的封装,基类的改变,对派生类有很大的原创 2020-07-10 11:00:51 · 255 阅读 · 0 评论 -
c++继承(五)——基类与友元(了解)
友元关系不能继承,也就是说基类友元不能访问子类私有和保护成员class Student;class Person{public: friend void fun(const Person& p, const Student& s);protected: int Ppro = 0;private: int Ppri = 1;};class Student :public Person{protected: int Spro = 0;private: int Sp原创 2020-07-03 13:57:45 · 761 阅读 · 0 评论 -
c++继承(二)——public、protected、private
访问限定符中的public、protected、privateclass A{public: void fun() { cout << pro << pri << pub; }protected: int pro = 1;private: int pri = 1;public: int pub = 1;};int main(){ A a; a.fun(); a.pub; return 0;}在一个类体中,自己可以访问自己的原创 2020-06-24 11:45:19 · 132 阅读 · 0 评论 -
c++继承(一)——初识继承
继承的概念继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特 性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构, 体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。继承的定义class Base{public: int base;};class Derive:public Base{public: int derive;};Base就是基类,Derive是派生类cl原创 2020-06-24 10:16:57 · 282 阅读 · 1 评论 -
非比较排序——计数排序
计数排序是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法。 [1] 当然这是一种牺牲空间换取时间的做法,而且当O(k)>O(nlog(n))的时候其效率反而不如基于比较的排序(基于比较的排序的时间复杂度在理论上的下限是O(nlog(n)), ...原创 2020-05-05 13:01:11 · 180 阅读 · 0 评论 -
C语言——归并排序(循环)
上一篇我们写到的是归并排序分治算法是用递归来实现的,但是其实我们自己观察可以写出一种不需要递归的方法,就是我们可以不需要分解的步骤,直接把序列当做已经分解好的序列来进行合并即可。代码实现:// 归并排序非递归实现 void MergeSortNonR(int* arr, int size){ int gap = 1; int* temp = (int*)malloc(size * s...原创 2020-05-05 11:49:32 · 464 阅读 · 0 评论 -
C语言——归并排序(分治)
归并排序该排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有 序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。图示:代码实现 // 归并排序递归实现 void MergeData(int* arr, int left, int m...原创 2020-05-05 10:49:45 · 795 阅读 · 0 评论 -
C语言——快速排序(前后指针法)
前后指针法思想就是俩个指针一前一后,然后从头开始遍历,当遇到比基准值小的值,俩个指针往后走一步,遇到比基准值大的就prev指针不动,cur往后走,当cur遇到比基准值小的就停下来, 然后cur指针每一次停止俩个指针之间的位置比较一下,如果俩个之间的差不是一的话,就交换俩个位置的数据,一直循环,知道遍历结束,用prev的后一个不是基准元素的位置的话,就,让prev和基准值进行交换。图示:代码...原创 2020-05-04 13:17:17 · 4392 阅读 · 0 评论 -
C语言——快速排序(挖坑法)
挖坑法原理图示:代码实现:// 挖坑法 int PartSort2(int* arr, int left, int right){ int end = right; int key; int mid = GetIndexMid(arr, left, right); if (mid != end) { int temp = arr[mid]; arr[mid] = a...原创 2020-05-03 13:17:49 · 609 阅读 · 0 评论 -
C语言——快速排序(hoare版本)
快速排序其基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右 子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。具体的区间划分方式我这里总结了三种:hoare版本挖坑法前后指针法图示:代码实现://快速排序hoare版本 int PartSort1(int*...原创 2020-05-01 22:29:57 · 512 阅读 · 0 评论 -
冒泡排序以及优化
冒泡排序原理:就是遍历一次,然后将最大的数据给移动到序列尾部,这个遍历的过程是从头开始,一个个的比较前面的比后面的大,就交换位置,从后面的开始继续往后比较,一组遍历下来之后,最大的数据就移动到了尾部,然后控制下一次的遍历,遍历到倒数第二个元素的时候就不在往后比较了,当最后只有一个数据的时候就将数据按照升序排好了。原理图示:一次遍历走下来的整个过程和结果然后按照这样的遍历方式一直遍历下去,...原创 2020-04-28 15:47:26 · 235 阅读 · 0 评论 -
(直接)选择排序和堆排序
选择排序其思想是: 每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。图示:代码实现:void swap(int* arr, int num1, int num2){ int temp = arr[num1]; arr[num1] = arr[num2]; arr[num2] = temp;}void SelectS...原创 2020-04-27 13:13:35 · 317 阅读 · 1 评论 -
插入排序和希尔排序
插入排序也叫直接插入排序是一种简单的插入排序法其基本思想就是:把待排序的记录按其关键码值的大小逐个插入到一 个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。整个排序的过程如下图:代码实现:void InsertSort(int* arr, int size){ int i = 1; for (; i < size; i++) { /*这种写法...原创 2020-04-26 17:19:52 · 238 阅读 · 0 评论 -
数据结构——排序
排序基本上可以分为四大类:插入排序、选择排序、交换排序、归并排序。从占用的空间来看还可以分为内部排序、和外部排序。当然,还有很特殊的排序的方法,比如计数排序、基数排序。所谓排序,就是讲一串有相同特征的数据,按照从小到大或者从大到小的顺序给排列。每一种排序都有自己的优点,不同的排序方法可能适用于不同的场景,衡量一个排序的好坏有以下几个数据来判断:时间复杂度、空间复杂度、稳定性。...原创 2020-04-26 13:32:43 · 221 阅读 · 0 评论