算法与数据结构

C/C++版数据结构之排序算法

柔情痞子 提交于 2020-01-03 05:17:59
今天讨论下数据结构中的排序算法。 排序算法的相关知识: (1)排序的概念:所谓排序就是要整理文件中的记录,使之按关键字递增(或递减)次序排列起来。 (2)稳定的排序方法:在待排序的文件中,若存在多个关键字相同的记录,经过排序后这些具有相同关键字的记录之间的相对次序保持不变,该排序方法是稳定的。相反,如果发生改变,这种排序方法不稳定。 (3)排序算法的分类(分为5类):插入排序、选择排序、交换排序、归并排序和分配排序。 (4)排序算法两个基本操作:<1>比较关键字的大小。 <2>改变指向记录的指针或移动记录本身。 具体的排序方法: 插入排序 <1>插入排序(Insertion Sort)的思想:每次将一个待排序的记录按其关键字大小插入到前面已经排好序的子记录中的适当位置,直到全部记录插入完成为止。 <2>常用的插入排序方法有直接插入排序和希尔排序。 (1)直接插入排序 <1>算法思路:把一个记录集(如一个数组)分成两部分,前半部分是有序区,后半部分是无序区;有序区一开始有一个元素r[0],无序区一开始是从r[1]到之后的所有元素;然后每次从无序区按顺序取一个元素r[i],拿到有序区中由后往前进行比较,每次比较时,有序区中比r[i]大的元素就往后移动一位,直到找到小于r[i]的元素,这时r[i]插到小元素的后面,则完成一趟直接插入排序。如此反复,从无序区不断取元素插入到有序区

java数据结构之排序

不想你离开。 提交于 2020-01-03 05:05:04
写在前面的话:本篇文章是我自己阅读程杰老师的大话数据结构之后自己所做的总结,网上有很多关于排序的详细介绍,我推荐 伍迷家园 所写的文章,介绍的非常详细。 排序是我们在程序中经常要用到的一种算法,好的排序可以极大的提高我们的工作效率,本篇主要介绍几种常见的排序算法; (简单说明: 下面的java程序是用来排序的,其中sum为排序数组,sum[0]不进行排序,只作为哨兵或者临时变量) 1、冒泡排序: 冒泡排序是一种交换排序,其的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。 1 //冒泡排序2 最正宗的冒泡排序,i每循环一次,最小的数就像气泡一样慢慢浮到水面上 2 public static void BubbleSort_2(int[] num){ 3 for(int i = 1; i < num.length; i++){ 4 for(int j = num.length-1; j > i; j--){ 5 if(num[j-1] > num[j]){ 6 Swap(num,j-1,j); //交换函数 交换num[j-1]和num[j]的值 7 } 8 } 9 } 10 } 2、选择排序: 简单选择排序法(Simple Selection Sort)就是通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1≤i≤n

0043数据结构之红黑树

狂风中的少年 提交于 2020-01-01 17:56:23
----------------------红黑树----------------------------- 红黑树仍然是一颗二分搜索树,和AVL一样,都是在二分搜索树的基础上加了一些限制条件:具体的5个限制条件如下: 1) 每个节点或者是红色的,或者是黑色的 2) 根节点是黑色的 3) 每一个叶子节点(最后的空节点叫叶子节点)是黑色的 4) 如果有一个节点是红色的,那么它的两个孩子节点都是黑色的 5) 从任意一个节点到叶子节点,经过的黑色节点是一样的 2-3树是一颗绝对平衡的树:从根节点到任意一个叶子节点经过的节点数是相同的,是通过融合(新加的节点一定是先和父亲节点融合,红黑树也是这个原理,所以红黑树新加的节点一定是红色的,即构造方法默认红色)-拆分-融合的形式来保证绝对平衡的。 红色的节点:代表他和它的父亲是融合在一起的 ,代表2-3树中的3节点 红黑树是“黑平衡”的二叉树:即红黑树限制条件的第5条,任意节点到叶子节点经过的黑色节点是相同的。 严格意思上来讲,不是平衡儿二叉树,即左右子树的高度差是有可能大于1的。红黑树最大高度2logn,所以时间复杂度是O(logn)的 红黑树与AVL树相比: 查找:红黑树略慢于AVL树 新增和删除:红黑树快于AVL树 所以如果存储的数据经常发生新增和删除:选择红黑树 如果存储的数据基本不发生变化,只是用于查询:选择AVL树

JAVA数据结构--快速排序

≯℡__Kan透↙ 提交于 2019-12-31 22:09:30
快排概念 快速排序 ( 英语: Quicksort),又称 划分交换排序 ( partition-exchange sort),一种排序算法,最早由东尼·霍尔提出。在平均状况下,排序 个项目要 (大O符号)次比较。在最坏状况下则需要 次比较,但这种状况并不常见。事实上,快速排序通常明显比其他 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。 实现思想 快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。 步骤为: 从数列中挑出一个元素,称为"基准"(pivot), 重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(相同的数可以到任何一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为 分区(partition) 操作。 递归地(recursively)把小于基准值元素的子数列和大于基准值元素的子数列排序。 递归到最底部时,数列的大小是零或一,也就是已经排序好了。这个算法一定会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。 借用下啊哈算法的图: i和j分别为左哨兵和右哨兵,这里枢纽元定为6,然后分别从左往右(i++)和右往左(j--)开始遍历 左哨兵查找比6大的元素

【数据结构算法自学笔记】自学笔记 思路+伪代码 (持续更新)

别来无恙 提交于 2019-12-31 14:31:45
数据结构算法自学笔记 大话思路与伪代码 以下为笔者自学过程中觉得需要记录的东西,并不代表正确且专业的知识,所以如果大家看到有不对的地方,希望大家能高抬贵手多多指出,谢谢!(持续更新) 一、排序 一)插入排序 插入排序对于少量元素的排序是一个比较有效的算法。 白话思路 :对于一个未排列的数组,暂且称当前正在排列移动的数字称作当前数。一般当前数从数组的第二位开始,遵循从当前数的当前位置向前开始比对,例如:a[1]需要和下标为1之前的数字一一比较,即与a[0]进行比较,也就是当前数从右向左依次比较。如果比较过程中,发现比当前数大的比较数,怎么将比较数往后移动一位,同时,该比较数之前的数同意向后移动一位,直到一个比当前数小的数字,将当前数插入到该数字之后的位置上。 伪代码 : INSTERTION - SORT(A) //A为传入的参数 是一个数组 for j = 1 to A . length key = A [ j ] //将当前待排序的元素备份 i = j - 1 //将下标定位到当前待排序数的前一位 while ( i > 0 && A [ i ] > key ) //当前排序的数字依次与下标之前的元素比较 为的是找到比当前排序数大的元素 //然后将它们依次后移一位,直到找到比key小的值,停止,退出循环 A [ i + 1 ] = A [ i ] i = i - 1 A [ i

图解数据结构(04) -- 哈希表

左心房为你撑大大i 提交于 2019-12-30 23:08:15
哈希表 1、什么是哈希表 2、哈希函数 哈希函数的实现 3、哈希表的读写操作 写操作(put) 读操作(get) 扩容(resize) 4、总结 1、什么是哈希表 哈希表(hash table),这种数据结构提供了键(Key)和值 (Value)的映射关系;只要给出一个Key,就可以高效查找到它所匹配的Value,时间复杂度接近于O(1) 2、哈希函数 散列表在本质上也是一个数组,可是数组只能根据下标,像a[0]、a[1]、a[2]、a[3]、a[4]这样来访问,而散列表的Key则是以字符串类型为主的,例如以学生的学号作为Key,输入002123,查询到李四;或者以单词为Key,输入by,查询到数字46……所以需要一个“中转站”,通过某种方式, 把Key和数组下标进行转换,这个中转站就叫作哈希函数。 哈希函数的实现 以Java的常用集合HashMap为例,来讲解哈希函数在Java中的实现: 在Java及大多数面向对象的语言中,每一个对象都有属于自己的hashcode,这个hashcode是区分不同对象的重要标识,无论对象自身的类型是什么,它们的 hashcode都是一个整型变量。 既然都是整型变量,想要转化成数组的下标简单的转化方式就是按照数组长度进行 取模运算 index = HashCode (Key) % Array.length 通过哈希函数*

数据结构与算法-第三章 链表

血红的双手。 提交于 2019-12-30 19:15:44
第三章 链表 3.1 链表(Linked List)介绍 链表是有序的列表,但是它在内存中是存储如下 小结上图: 链表是以节点的方式来存储,是链式存储 每个节点包含data 域, next 域:指向下一个节点. 如图:发现链表的各个节点不一定是连续存储. 链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定 单链表(带头结点) 逻辑结构示意图如下 3.2 单链表的应用实例 使用带head 头的单向链表实现–水浒英雄排行榜管理完成对英雄人物的增删改查操作 (1) 第一种方法在添加英雄时,直接添加到链表的尾部 思路分析示意图: 单链表分析: class HeroNode { int no ; String name ; String nickName ; HeroNode next } 添加(创建) 1. 先创建一个head 头节点,作用就是表示单链表的头 2. 后面我们每添加一个节点,就直接加入到 链表的最后 遍历:1. 通过一个辅助变量遍历,帮助遍历整个链表 第二种方式在添加英雄时,根据排名将英雄插入到指定位置(如果有这个排名,则添加失败,并给出提示) 思路的分析示意图: **需要按照编号的顺序添加** 1. 首先找到新添加的节点的位置,是通过辅助变量 ( 指针 ) ,通过遍历来搞定 2. 新的节点.next = temp.next 3. 将temp.next = 新的节点

C语言算法与数据结构——hashmap(板子)

巧了我就是萌 提交于 2019-12-30 02:56:09
# include <stdio.h> # include <stdlib.h> # include <string.h> typedef struct Node * Link ; struct Node { char data [ 15 ] ; Link next ; int count ; } ; typedef struct Table * hashtable ; struct Table { int size ; //链地址法 Link heads ; } ; hashtable creat ( int s ) { hashtable h = ( hashtable ) malloc ( ( sizeof ( struct Table ) ) ) ; h -> size = s ; h -> heads = ( Link ) malloc ( h -> size * sizeof ( struct Node ) ) ; int i ; //初始化表头结点 for ( i = 0 ; i < s ; i ++ ) { h -> heads [ i ] . data [ 0 ] = '\0' ; h -> heads [ i ] . next = NULL ; h -> heads [ i ] . count = 0 ; } return h ; } int hash (

算法与数据结构【数据结构】——二、线性表:链表与数组

独自空忆成欢 提交于 2019-12-30 02:47:48
算法与数据结构【数据结构】——二、线性表:链表与数组 线性表是最简单的线性结构; 线性结构是一个数据元素的有序集; 一、线性结构与线性表 (1)线性结构的基本特征 唯一的“第一元素” 唯一的“最后元素” 除 最后元素 外,均有 唯一的后继 除 第一元素 外,均有 唯一的前驱 (2)线性表的类型定义 数据对象: D={ ai | ai ∈ElemSet, i=1,2,…,n, n≥0 } {称 n 为线性表的表长; 称 n=0 时的线性表为空表。} 数据关系: R1={ <ai-1 ,ai >|ai-1 ,ai∈D, i=2,…,n } {设线性表为 (… ai …) 称 i 为 ai 在线性表中的位序。} 基本操作: 更复杂的功能 都可以基于 基本功能 实现 结构初始化操作 InitList( &L ) 创建空表 结构销毁操作 DestroyList( &L ) 销毁表 引用型操作 ListEmpty( L ) 判空 ListLength( L ) 求表长 PriorElem( L, cur_e, &pre_e ) 求前驱 NextElem( L, cur_e, &next_e ) 求后继 GetElem( L, i, &e ) 索引查找——L[i] LocateElem( L, e, compare( ) ) 定位函数/按值查找——if L[i]=cmp(e) return i

Mysql 学习之EXPLAIN实战

半世苍凉 提交于 2019-12-30 01:47:15
一、MYSQL的索引 索引(Index):帮助Mysql高效获取数据的一种数据结构。用于提高查找效率,可以比作字典。可以简单理解为排好序的快速查找的数据结构。 索引的作用:便于查询和排序(所以添加索引会影响where 语句与 order by 排序语句)。 在数据之外,数据库还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用数据。这样就可以在这些数据结构上实现高级查找算法。这些数据结构就是索引。 索引本身也很大,不可能全部存储在内存中,所以索引往往以索引文件的形式存储在磁盘上。 我们平时所说的索引,如果没有特别指明,一般都是B树索引。(聚集索引、复合索引、前缀索引、唯一索引默认都是B+树索引),除了B树索引还有哈希索引。 优点:A、提高数据检索效率,降低数据库的IO成本 B、通过索引列对数据进行排序,降低了数据排序成本,降低了CPU的消耗。 缺点:A、索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引也是占用空间的。 B、对表进行INSERT、UPDATE、DELETE操作时,MYSQL不仅会更新数据,还要保存一下索引文件每次更新添加了索引列字段的相应信息。 在实际的生产环境中我们需要逐步分析,优化建立最优的索引,并要优化我们的查询条件。 索引的分类:1、单值索引 一个索引只包含一个字段,一个表可以有多个单列索引。 2、唯一索引 索引列的值必须唯一