排序算法

Java基础--常用API--集合类相关API

£可爱£侵袭症+ 提交于 2020-03-23 06:07:00
一、泛型   1、泛型的本质是将类型参数化,即将数据类型作为参数。     2、泛型可以在编译期进行检查,其所有的强制转换是隐式且自动的,提高了代码的安全性。      3、泛型可以用在类(泛型类)、接口(泛型接口)、方法(泛型方法)的创建。       4、泛型的类型参数只能为引用类型,不能为基本类型。 二、常用集合类 1、体系分类:   (1)Collection体系: Set、List、Queue。     Set:元素无序且不可重复。HashSet,TreeSet。     List:元素有序且可重复。LinkedList,ArrayList。     Queue:队列,先进先出。Deque。   (2)Map体系:HashMap、TreeMap。 2、分类如下 3、集合与数组的区别 三、Collection集合 1、相关方法: 2、迭代器   (1)使用Iterator接口,不能直接new,使用集合的方法去调用。即Iterator it = c.iterator();     (2) java.util.Iterator; 其使用流程为问,取,删(不必须)。      (3)方法:     boolean hasNext();问操作,查询当前集合是否还有元素。     Object next();取操作,取出集合元素。     Iterator remove() ;删操作

数据结构与算法复习(一) 排序算法(I)

江枫思渺然 提交于 2020-03-22 13:41:44
这篇文章将会介绍最常见的排序算法(使用 JavaScript 语言实现) PS:这里我会尽量使用语言无关的语法去写,大家不要太在意语言,重要的是算法的实现思路 1、冒泡排序 将数组分为有序区(左边)和无序区(右边) 每次从无序区的最后一个元素开始,一直向前冒泡到无序区的第一个位置,使其变成有序 function swap(A, i, j) { if (i === j) return [A[i], A[j]] = [A[j], A[i]] } function bubbleSort(A) { for (let i = 0, ii = A.length - 1; i < ii; i++) { let done = true for (let j = A.length - 1; j > i; j--) { if (A[j] < A[j - 1]) { swap(A, j, j - 1) done = false } } if (done) break } } 2、选择排序 将数组分为有序区(左边)和无序区(右边) 每次从无序区中选择一个合适的元素,并将其交换到无序区的第一个位置,使其变成有序 function swap(A, i, j) { if (i === j) return [A[i], A[j]] = [A[j], A[i]] } function selectionSort(A

排序算法

落花浮王杯 提交于 2020-03-22 10:50:37
目录 快速排序(基于交换) 特性 思想 代码 冒泡排序(交换排序) 思想: 特点: 代码: 直接插入排序(插入排序) 思想: 特点: 代码: 折半插入排序(插入排序) 思想: 特点: 代码: 希尔排序(插入排序) 思想: 特点: 代码: 简单选择排序: 思想: 特点: 代码: 堆排序 (选择排序) 思想:按照层次遍历的顺序标号映射到数组中。 特点: 代码: 归并排序 特性 思想 代码 基数排序 思想: 特点: 快速排序(基于交换) 特性 每次使一个数归位。不稳定 思想 每次partition划分数组为两部分并返回下标。随后递归地对左右序列快速排序。 代码 int Partition(int arr[],int left,int right) { int i = left; int j = right; int pivotindex = left; //基准坐标可以任意选 int pivotnum = arr[pivotindex]; //基准数 cout << "pivotnum = " << pivotnum << endl; while(i < j) //当i==j的时候,i和j的下标就是基准数的正确位置。 { while (i < j && arr[j] >= pivotnum) //先从后面往前找小于基准数 j--; arr[i] = arr[j]; //复制到前面i的位置

数据结构之排序

試著忘記壹切 提交于 2020-03-22 06:37:29
这篇文章主要讨论常见的排序算法。   排序算法分为内部排序和外部排序两种,内部排序是指只利用内存来完成的排序,外部排序是指借助外部存储设备完成的排序。外部排序主要针对记录比较多、内存无法一次全部加载的情况。我们这里主要关注内部排序。   内部排序大致分为四类:1)插入排序;2)交换排序;3)选择排序;4)归并排序;5)基数排序。我们下面会分别进行描述。   首先,我们来确定排序的对象,这里我们假设排序的对象是随机生成的非重复整数数组,有下面的辅助方法: 整型数组辅助方法(生成和打印) 1 public static int[] createArray(int count, int max) 2 { 3 if (count < 1) return null; 4 int[] arrResult = new int[count]; 5 java.util.Random r = new java.util.Random(); 6 for(int i = 0; i < arrResult.length; i++) 7 { 8 int temp = 0; 9 while(true) 10 { 11 temp = r.nextInt(max); 12 int j = 0; 13 for (j = 0; j < i; j++) 14 { 15 if (arrResult[j] == temp)

LeetCode.944-删除列保证排序(Delete Columns to Make Sorted)

﹥>﹥吖頭↗ 提交于 2020-03-22 04:12:13
这是悦乐书的第 362 次更新,第 389 篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第224题(顺位题号是944)。我们给出了一个N个小写字母串的数组A,它们的长度都相同。 现在,我们可以选择任何一组删除索引,对于每个字符串,我们删除这些索引中的所有字符。 例如,如果我们有一个数组 A = [“abcdef”,“uvwxyz”] 和删除索引 {0,2,3} ,那么删除后的数组变成了 [“bef”,“vyz”] ,纵向上看,每一列是 [“b”,“v”] , [“e”,“y”] 和 [“f”,“z”] 。(形式上,第c列是 [A[0][c] , A[1][c] ,..., A[A.length-1][c]] 。) 假设我们选择了一组删除索引 D ,使得在删除之后,A中的每个剩余列都处于递增排序顺序。返回 D.length 的最小可能值。例如: 输入:[“cba”,“daf”,“ghi”] 输出:1 说明:在选择 D = {1} 之后,每列 [“c”,“d”,“g”] 和 [“a”,“f”,“i”] 处于递增的排序顺序。如果我们选择 D = {} ,则列 [“b”,“a”,“h”] 将不是递增排序顺序。 输入:[“a”,“b”] 输出:0 说明:D = {} 输入:[“zyx”,“wvu”,“tsr”] 输出:3 说明:D = {0,1,2} 注意 :

JS--排序之快排和归并

时光总嘲笑我的痴心妄想 提交于 2020-03-21 22:24:46
目录 JS排序算法之快排和归并 快速排序 归并排序 JS排序算法之快排和归并 快速排序 原理: 选择一个key(一般是第一个元素), 将数组划分为两个区域. 左边全部区域小于等于key, 右边全部大于key. 然后在通过这种方法将每个区域划分为两个区域. 整个过程可以递归实现,以此实现整个数据有序 时间复杂度: O(n*log(n)) 最坏时间复杂度: O(n^2) 最坏情况: 原数组是升序(降序), 需要排成降序(升序) 不稳定的排序 特性: 数组分块,且左边区域小于右边(升序) 不稳定原因: 元素交换是跨元素直接交换, 相邻相同元素可能发生位置交换 性能: 最好的的快速排序方法 示例过程: function quickSort(ary) { let n = ary.length; function sort(ary, start, end) { if(end <= start) return; let i = start, j = end, key = ary[start]; // 设置第一个元素为key while(true) { // 从左向右找到大于key的元素位置(大于key循环停止, i就是该元素位置) while(ary[++i] < key) { // 到达末尾退出循环 if(i === end) break; } // 从右向左找到小于key的元素位置

JS--排序算法之堆排序

血红的双手。 提交于 2020-03-21 22:24:29
目录 排序算法之堆排序 什么是堆? 堆排序 排序算法之堆排序 什么是堆? 堆是一颗完全二叉树 堆分为 最大堆和最小堆 最大堆父节点都大于子节点, 最小堆父节点都小于子节点 左子节点: 2*i +1 (i: 父节点index) 右子节点: 2*i+2 堆排序 利用最大堆实现升序, 最小堆实现降序. 因为最大堆的根父节点一定是最大的, 让它和队尾元素互换, 然后在从堆中排除最后一个元素, 并复原最大堆. 循环 n-1次. 关键在于构建最大堆 最大堆的构建过程 时间复杂度: O(n*log(n)) 不稳定的排序 特征: 找出最大的元素放在末尾(升序) function heapSort(ary) { // 实现最大堆 // start: 父节点, end: 循环深度 function maxHeap(ary, start, end) { let parent = start, // 父节点 son = parent*2 + 1, // 左子节点 temp = null; // 规定循序最大深度 while(son<=end) { // 如果存在右子节点, 并且判断右节点是否大于左节点 if(son+1<=end && ary[son] < ary[son+1]) son++; if(ary[son] > ary[parent]) { temp = ary[son]; ary[son] =

Python常见的几种算法

人盡茶涼 提交于 2020-03-21 10:48:59
冒泡排序 冒泡排序 (英语:Bubble Sort)是一种简单的排序算法。它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。 冒泡排序算法的运作如下: 比较相邻的元素。如果第一个比第二个大(升序),就交换他们两个。 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。 针对所有的元素重复以上的步骤,除了最后一个。 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 冒泡排序的分析 交换过程图示(第一次): 那么我们需要进行n-1次冒泡过程,每次对应的比较次数如下图所示: def bubble_sort(alist): for j in range(len(alist)-1,0,-1): # j表示每次遍历需要比较的次数,是逐渐减小的 for i in range(j): if alist[i] > alist[i+1]: alist[i], alist[i+1] = alist[i+1], alist[i] li = [54,26,93,17,77,31,44,55,20] bubble_sort(li) print(li) 时间复杂度

经典排序算法 – 插入排序Insertion sort

大城市里の小女人 提交于 2020-03-21 07:41:01
经典排序算法 – 插入排序Insertion sort 插入排序就是每一步都将一个 待排数据 按其大小插入到 已经排序的数据中 的适当位置,直到全部插入完毕。 插入排序方法分 直接插入排序 和折半插入排序两种,这里只介绍直接插入排序,折半插入排序留到“查找”内容中进行。 入。 源码如下: (1) (2) 设数组为a[0…n-1]。 1. 初始时,a[0]自成1个有序区,无序区为a[1..n-1]。令i=1 2. 将a[i]并入当前的有序区a[0…i-1]中形成a[0…i]的有序区间。 3. i++并重复第二步直到i==n-1。排序完成。 源码如下: (3) 这样的代码太长了,不够清晰。现在进行一下改写,将搜索和数据后移这二个步骤合并。 即每次a[i]先和前面一个数据a[i-1]比较,如果a[i] > a[i-1]说明a[0…i]也是有序的,无须调整。 否则就令j=i-1,temp=a[i]。然后一边将数据a[j]向后移动一边向前搜索,当有数据a[j]<a[i]时停止并将temp放到a[j + 1]处。 源码如下: (4) 源码如下: 来源: https://www.cnblogs.com/chengbao/p/4859358.html

面试总结——数据库篇

旧街凉风 提交于 2020-03-21 07:30:03
前言:前面介绍了Java、JVM相关方面的题目,该篇介绍数据库方面相关的题目,这里数据库为MySql,因为笔者或朋友在面试过程中都是涉及MySql的相关知识点。 数据库篇 在数据库题目中,由于现在大部分公司都是使用MySql作为数据库,因此笔者及其朋友所遇到的问题也都是MySql相关的知识点。 1)MySql中索引的基本定义,优劣势,以及索引优化。 索引是帮助Mysql高效获取数据的 数据结构 ,因此,索引的 本质 就是数据结构,索引的目的在于提高 查询 效率,可类比字典。 索引: 排好序的快速查找的数据结构。 用途: 排序 + 快速查找 。注意,是两种功能。 数据库除了存储数据本身之外,还维护着一个满足特定查找算法的数据结构,这些数据结构以某种方式指向数据,这样就可以在这些数据结构的基础上实现高级查找算法,这种 数据结构 就是索引。 MySql索引通常是指 B+树 索引。 索引优势: 类似书籍的目录,提高数据检索的效率,降低数据库的 IO 成本(因为数据最终是存储在 磁盘 上的)。 通过索引列对数据进行排序,降低数据排序的成本,降低了 CPU 的消耗(因为排好序,查询速度增加)。 索引劣势: 索引也是 一张表 ,保存了主键与索引字段,并指向实体表的记录,所以索引列也是要 占用磁盘空间的 。 虽然提高了 查询速度 ,但是会 降低更新速度(因为数据更新后,需要重新对索引排序) ,如