数据结构
人山人海肉最可爱
目前菜鸟一枚,希望大佬们多多指教,渴望有一天可以和大佬们肩并肩。
展开
-
堆的创建、插入、删除等操作
堆的概念:如果有一个关键码的集合K = {K0,K1,K2,…,Kn-1},把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足:Ki <= K2 * i + 1且Ki <= K2 * i + 2(Ki >= K2 * i + 1且Ki >= K2 * i + 2)i = 0,1,2…,则称为小堆(或大堆)。...原创 2018-09-04 19:49:27 · 2019 阅读 · 1 评论 -
快速排序
基本思想:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后左右子序列重复该过程,直到所有元素都排在相应位置上为止。大概基本的框架就是:将区间按照基准值划分为左右两半部分的常见方式有:hoare版本挖坑法前后指针先来看看hoare版本:它的做法是先找一个基准值,一般都是找最后一...原创 2018-09-28 15:45:38 · 194 阅读 · 0 评论 -
冒泡排序
冒泡排序是一个很经典的排序,它的基本思想也很简单,就是在每一趟的排序中,每次都是从第一个元素开始,让它与它后边的元素比较,如果比它后边的元素大,则交换,如果不是,则继续向后走,重复上边的比较步骤,每一趟只是把最大的那个数排到了最后位置,所有总共要进行n趟排序,每一趟要排序的个数要减去已经排好的个数。void BubbleSort(int arr[], int size){ int i = ...原创 2018-09-26 18:11:19 · 135 阅读 · 0 评论 -
直接选择排序
基本思想:每一趟(第i趟,i = 0,1,…,n - 2)在后面n - i个待排序的数据元素集合中选出关键码最小的数据元素,作为有序元素序列的第i个元素。待到第n - 2趟做完,待排序元素集合中只剩下1个元素,排序结束【直接选择排序】在元素集合array[i]-array[n-1]中选择关键码最大(小)的数据元素若它不是这组元素中的最后一个(第一个)元素,则将它与这组元素中的最后一个(第...原创 2018-09-26 09:10:50 · 159 阅读 · 0 评论 -
插入排序----希尔排序
希尔排序又称缩小增量排序,是对直接插入排序的优化分析:void ShellSort(int arr[], int size){ int i = 0; int gap = 3; while (gap > 0) { for (i = gap; i < size; i++) { int key = arr[i]; int end = i - gap; ...原创 2018-09-25 21:41:43 · 137 阅读 · 0 评论 -
插入排序-----直接插入排序
基本思想:每一步将一个待排序的元素,按其排序码的大小,插入到前面已经排好序的一组元素的合适位置上去,直到元素全部插完为止。具体代码实现:void InsretSort(int arr[], int size){ int i = 1; for (i = 1; i < size; i++) { int key = arr[i]; int end = i - 1; //找...原创 2018-09-25 21:22:19 · 242 阅读 · 0 评论 -
哈希
哈希的概念哈希是一种搜索结构,不过哈希搜索不同于顺序搜索和二叉搜索的是:可以不经过任何比较,一次直接从表中得到要搜索的元素。如果构造一种存储方式,通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立一一映射的关系,那么在查找时通过该函数可以很快找到该元素。哈希的搜索效率可高达O(1)。常见的哈希函数直接定制法取关键字的某个线性函数为散列地址:Hash(Key) =...原创 2018-09-25 21:07:23 · 884 阅读 · 0 评论 -
模拟实现一个简单的字典
分析:实现一个简单的英汉字典 这个问题其实和我的上一篇博客《判断一个单词拼写是否正确》类似,都可以用二叉搜索树来解决,只不过这次结点里存放的数据,是以键值对的形式存放的,意思就是这个结点的数据由两种类型的数据组成,一个是英语,一个是英语对应的汉语意思。 具体的插入、删除、查找操作为什么那样实现,请参考这篇博客:...原创 2018-09-15 15:19:45 · 980 阅读 · 0 评论 -
判断一个单词拼写是否正确
分析: 我们可以用二叉搜索树来解决这个问题,把单词存在一个结点里,这个结点还能保存它的左右孩子指针,左子树里存的是比它小的单词,右子树里存的是比它大的单词。二叉搜索树的概念和基本操作在我的上一篇博客中已经解释清楚了,这是上一篇博客连接:...原创 2018-09-15 15:00:38 · 2355 阅读 · 0 评论 -
二叉搜索树的初始化、插入、删除、查找、销毁等操作
二叉搜索树的概念二叉搜索树又称二叉排序树,它或者是一颗空树,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有结点的值都小于根结点的值若它的右子树不为空,则右子树上所有结点的值都大于根结点的值它的左右子树也分别为二叉搜索树 例: 我们要实现这些操作。先定义一个二叉搜索树的结构体,这个结构体成员包括左右孩子两个指针,还有它的数据:typedef int B...原创 2018-09-15 14:41:00 · 2356 阅读 · 0 评论 -
堆排序
堆排序:将堆中的数据按照升序/降序排列。在这里也会用到堆的调整、创建操作,具体代码点连接:https://mp.csdn.net/mdeditor/82346337分析:如果我们要按升序排的话,我们要把这个堆建立成大堆,如果我们要按降序排的话,我们要把这个堆建立成小堆。例如:我们要把它排成升序,先把它建立成一个大堆,那堆顶元素就是最大元素了,我们让最后一个元素和堆顶元素交换,那最后一个元素...原创 2018-09-05 17:38:25 · 140 阅读 · 0 评论 -
二叉树的基本操作、面试题:前、中、后序遍历,创建、销毁二叉树,得到二叉树中叶子节点的个数、第K层结点的个数、第K层叶子结点的个数、树的高度
我们要先搞清楚二叉树的特点:每个结点最多有两颗子树,即二叉树不存在度大于2的结点;二叉树的子树有左右之分,其子树的次序不能颠倒。 满二叉树:在一颗二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子结点都在同一层上。 完全二叉树:如果一颗具有N个结点的二叉树的结构与二叉树的前N个结点的结构相同,称为完全二叉树。 二叉树的性质:若规定根节点的层数为1,则一颗非空二叉树的第i层上最...原创 2018-09-03 11:02:21 · 1685 阅读 · 0 评论 -
100亿个数中找出最大的前K个数(海量数据topK问题)
分析:海量数据topK问题,在我们日常生活中应用非常广泛,比如微信的计步软件,它就是topK问题,统计出前K名,然后进行排序。那如何解决这个问题呢?我们用堆可以很好的解决这个问题。我们先用前K个数建立一个大堆/小堆(找最大前K个数用小堆,找最小前K个数用大堆,因为:如果找最大前K个数,我们建立一个大堆的话,我们需要用第N-K-1个数与堆顶元素比较,如果它比堆顶元素小我们就要舍弃它,但如果它比堆顶元...原创 2018-09-05 16:59:08 · 7883 阅读 · 0 评论 -
归并排序 && 外部排序
基本思想先对数据进行均分------>左右两半部分------->均分到左右部分已经有序------>归并归并排序核心步骤:分组归并MergeSort.h#ifndef __MERGESORT_H__#define __MERGESORT_H__#include<stdio.h>#include<string.h>#include&...原创 2018-10-07 19:37:50 · 894 阅读 · 0 评论