排序算法

Java 实现常见内排序

北城以北 提交于 2020-03-01 19:58:58
一、内排序 1、排序基本概念 (1)什么是排序?   排序指将一个数据元素集合或者序列 按照某种规则 重新排列成一个 有序的集合或者序列。分为内排序、外排序。排序算法的好坏直接影响程序的执行速度以及存储空间的占有量。 (2)什么是内排序?外排序?   内排序:指待排序的序列完全存放在内存中所进行的排序过程(不适合大量数据排序)。   外排序:指大数据的排序,待排序的数据无法一次性读取到内存中,内存与外存需进行多次数据交换,以达到排序的目的。 (3)什么是稳定排序?   稳定排序指的是 相等的数据经过某种排序算法排序后,仍能保证它们的相对顺序与未排序之前相同。   比如一个序列 a1 a2 a3 a4 a5, 且 a1 < a2 = a3 < a4 < a5。   若经过某种排序算法后,结果仍为 a1 < a2 = a3 < a4 < a5,那么该排序算法是稳定的。   若经过某种排序算法后,结果为 a1 < a3 = a2 < a4 < a5,那么该排序算法是不稳定的。 2、内排序分类 (1)按种类划分:   插入排序:直接插入排序、希尔排序。   选择排序:选择排序、堆排序。   交换排序:冒泡排序、快速排序。   归并排序:归并排序。 (2)按稳定排序划分:   稳定排序:冒泡排序、归并排序、直接插入排序。   非稳定排序:快速排序、希尔排序、堆排序、选择排序。 (3)比较:

Java编程的逻辑 (53) - 剖析Collections - 算法

六眼飞鱼酱① 提交于 2020-03-01 17:50:00
之前几节介绍了各种具体容器类和抽象容器类,上节我们提到,Java中有一个类Collections,提供了很多针对容器接口的通用功能,这些功能都是以静态方法的方式提供的。 都有哪些功能呢?大概可以分为两类: 对容器接口对象进行操作 返回一个容器接口对象 对于第一类,操作大概可以分为三组: 查找和替换 排序和调整顺序 添加和修改 对于第二类,大概可以分为两组: 适配器:将其他类型的数据转换为容器接口对象 装饰器:修饰一个给定容器接口对象,增加某种性质 它们都是围绕容器接口对象的,第一类是针对容器接口的通用操作,这是我们之前在接口的本质一节介绍的面向接口编程的一种体现,是接口的典型用法,第二类是为了使更多类型的数据更为方便和安全的参与到容器类协作体系中。 由于内容比较多,我们分为两节,本节讨论第一类,下节我们讨论第二类。下面我们分组来看下第一类中的算法。 查找和替换 查找和替换包含多组方法,我们分别来看下。 二分查找 我们在剖析Arrays类的时候介绍过二分查找,Arrays类有针对数组对象的二分查找方法,Collections提供了针对List接口的二分查找,如下所示: public static <T> int binarySearch(List<? extends Comparable<? super T>> list, T key) public static <T> int

JavaScript数组(一)——排序

吃可爱长大的小学妹 提交于 2020-03-01 03:11:31
JavaScript数组中有一个 reverse() 方法,可用于反转数组,如下代码所示: var arr = [0, 1, 2, 3]; arr.reverse(); console.log(arr);//[3, 2, 1, 0] 但是多数情况下这并不能满足开发的需求,真实的情况往往是降序或升序排列。对数组进行排序很自然地会想到冒泡排序算法,下面我们来看一个例子: var arr = [8, 1, 35, 3, 10]; // 冒泡排序 升序 function bubbleSort(arr){ var temp; for(var i = 0; i < arr.length; i++){ for(var j = i + 1; j < arr.length; j++){ if(arr[i] > arr[j]){ temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } } return arr; } console.log(bubbleSort(arr));//[1, 3, 8, 10, 35] 这段代码有两个 for 循环,实现的思路是用外层循环依次取出每个元素,用内层循环和剩下的元素进行比较,如果取出的这个数较大,就与较小的数交换位置,这样一轮内循环结束,最小的数就成了第一个元素,依次第二小的数成为第二个元素...

数据结构—排序

谁说我不能喝 提交于 2020-03-01 02:54:30
排序:假设含有 n 个记录的序列为 ,其相应的关键字分别为 ,需确定 的一种排列 ,使其相应的关键字满足 ( 非递减或非递增 )关系,即使得序列成为 一个按关键字有序的序列 ,这样的操作就称为 排序 。 相信大家都有着极其丰富的网上购物的经验,现在网上购物已经非常成熟,对用户来说带来了很大的方便。 假如我想买一台 iPhone4 的手机,于是上了某电子商务网站去搜索。可搜索后发现(如下图所示),有 8863 个相关的物品,如此之多,这叫我如何选择。我其实是想买便宜一点的,但是又怕遇到骗子,想找信誉好的商家,如何做? 下面的有些购物达人给我出主意了,排序呀。对呀,排序就行了(如下图所示)。我完全可以根据自己的需要对搜索到的商品进行排序,比如按信用从高到低、再按价格从低到高,将最符合我预期的商品列在前面,最终找到我愿意购买的商家,非常的方便。 网站是如何做到快速地将商品按某种规则有序的呢?—— 排序 。 1. 排序的基本概念与分类 排序是我们生活中经常会面对的问题。同学们做操时会按照从矮到高排列;老师查看上课出勤情况时,会按学生学号顺序点名;高考录取时,会按成绩总分降序依次录取等。那排序的严格定义是什么呢? 假设含有 n 个记录的序列为 ,其相应的关键字分别为 ,需确定 1,2,…… ,n 的一种排列 ,使其相应的关键字满足 ( 非递减或非递增 )关系

插入排序和归并排序

心不动则不痛 提交于 2020-03-01 02:24:39
插入排序 一共有三种:直接插入排序、希尔排序和折半插入排序。最后一个折半插入排序,感觉用在数组上面不太方便,就没写出来。 递归实现没有思路,使用的非递归算法。 直接插入排序 这个算法默认前n个数是已经排好序的,n随着你的插入逐渐变大,最开始是1。 然后从后往前逐渐查找应该插入的位置;我的算法是从小到大,那就依次对比当前位置的值是否比要插入的值大,如果大就往后移动一个位置,小于等于当前位置的值就进行插入结束这一次的插入操作,进入下一次。 希尔排序 这个排序算法的思路就是将数组分为好多组,然后逐渐减少,最终只剩下一组,就是最终的结果。 最开始将数组根据初始增量分为两两一组,在每一组内进行排序;逐渐缩短增量,直到增量为一,就是排好序的数组。 在组内排序的算法其实可以是别的算法。 折半插入排序 和直接插入排序思路相同,但是在查询插入点的时候,是从已经排好序的数组中间查询要插入的点,查询到之后将插入点之后的数依次后移,将数插入。 归并排序 数组从大依次切开,分为n组,然后再将相邻的两组进行合并,并排序,最后只剩下一组就是结果。这个算法使用递归会比较简单点。非递归实现,没思路。 代码 package 算法设计与分析 ; public class Work3 { public Work3 ( ) { int [ ] nums = { 2 , 3 , 8 , 4 , 5 , 7 , 1 , 9 ,

排序算法-09-冒泡排序(Bubble Sort)

不问归期 提交于 2020-03-01 01:24:25
##Basics Sorting - 基础排序算法 算法复习——排序 ###算法分析 时间复杂度-执行时间(比较和交换次数) 空间复杂度-所消耗的额外内存空间 使用小堆栈或表 使用链表或指针、数组索引来代表数据 排序数据的副本 对具有重键的数据(同一组数按不同键多次排序)进行排序时,需要考虑排序方法的稳定性,在非稳定性排序算法中需要稳定性时可考虑加入小索引。 稳定性 :如果排序后文件中拥有相同键的项的相对位置不变,这种排序方式是稳定的。 常见的排序算法根据是否需要比较可以分为如下几类: Comparison Sorting 1.Bubble Sort 2.Selection Sort 3.Insertion Sort 4.Shell Sort 5.Merge Sort 6.Quck Sort 7.Heap Sort Bucket Sort Counting Sort Radix Sort 从稳定性角度考虑可分为如下两类: -稳定 -非稳定 有关排序法的文章 常用排序算法总结(性能+代码) - SegmentFault Sorting algorithm - Wikipedia, the free encyclopedia - 各类排序算法的「平均、最好、最坏时间复杂度」总结。 经典排序算法总结与实现 | Jark's Blog - 基于 Python 的较为清晰的总结。 【面经

数据结构(一)

浪尽此生 提交于 2020-02-29 22:14:10
数据结构是什么? 数据结构使指数据之间的关系,包含有逻辑结构和存储结构。 逻辑结构分为线性(一对一),树状(一对多),图状(多对多),集合(无明显对应) 存储要正确反应逻辑 常见的存储类型有vector,list,deque等等 数据结构初入门(排序算法) 推荐几个排序总结博客 各种排序算法总结 排序算法总结——时间复杂度与稳定性 关于排序稳定性的定义 通俗地讲就是能保证排序前两个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同。在简单形式化一下,如果Ai = Aj,Ai原来在位置前,排序后Ai还是要在Aj位置前。 1.冒泡排序 先码上代码 # include <iostream> # include <cstdio> # include <cmath> # include <ctime> # include <time.h> # include <algorithm> # include <cstring> using namespace std ; void BubbleSort ( int arr [ ] , int length ) { clock_t start , end ; start = clock ( ) ; for ( int i = 0 ; i < length ; i ++ ) { for ( int j = 0 ; j < length -

python手写十大经典排序算法 一.冒泡排序法

半腔热情 提交于 2020-02-29 19:30:06
冒泡排序 (1)实现步骤 1.比较相邻两个元素,如果第一个比第二个大就交换对应位置 2.对每一对相邻元素作同样的操作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。 3.针对所有的元素重复以上的步骤,除了最后一个。 4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 (2)动画演示 (3)手撸代码 老铁看图,我在给您亲自捋一遍,如何用python实现冒泡排序.首先循环嵌套是跑不了,外层循环是用来控制运行次数,内层循环是实现,相邻两个位置上数的大小比较. lst = [ 5 , 9 , 4 , 8 , 7 ] # 设置一个待排序的数列 for i in range ( len ( lst ) ) : # 第一层循环:控制次数 for j in range ( len ( lst ) - 1 - i ) : # 第二次循环:实现相邻位置比大小,交换的功能 if lst [ j ] > lst [ j + 1 ] : lst [ j ] , lst [ j + 1 ] = lst [ j + 1 ] , lst [ j ] ```python 在这里插入代码片 (4)优化 如果说对于一个lst这种的,正好符合顺序,而常规操作,依旧是对他进行一遍无用操作 因此可得:优化点就是,尽量减少无用操作.只要知道本趟一次都没有交换位置的,就可以知道了

海量数据处理:十道面试题与十个海量数据处理方法总结

谁说我不能喝 提交于 2020-02-29 16:44:19
1、海量日志数据,提取出某日访问百度次数最多的那个IP。 首先是这一天,并且是访问百度的日志中的IP取出来,逐个写入到一个大文件中。注意到IP是32位的,最多有个2^32个IP。同样可以采用映射的方法,比如模1000,把整个大文件映射为1000个小文件,再找出每个小文中出现频率最大的IP(可以采用hash_map进行频率统计,然后再找出频率最大的几个)及相应的频率。然后再在这1000个最大的IP中,找出那个频率最大的IP,即为所求。 或者如下阐述(雪域之鹰): 算法思想:分而治之+Hash 1.IP地址最多有2^32=4G种取值情况,所以不能完全加载到内存中处理; 2.可以考虑采用“分而治之”的思想,按照IP地址的Hash(IP)%1024值,把海量IP日志分别存储到1024个小文件中。这样,每个小文件最多包含4MB个IP地址; 3.对于每一个小文件,可以构建一个IP为key,出现次数为value的Hash map,同时记录当前出现次数最多的那个IP地址; 4.可以得到1024个小文件中的出现次数最多的IP,再依据常规的排序算法得到总体上出现次数最多的IP; 2、搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。 假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个

[转]海量数据处理的面试题的方法总结

喜你入骨 提交于 2020-02-29 16:36:20
处理海量数据问题,无非就是: 分而治之/hash映射 + hash统计 + 堆/快速/归并排序; Bloom filter/Bitmap; Trie树/数据库/倒排索引; 外排序; 分布式处理之hadoop/mapreduce。 本文接下来的部分,便针对这5种方法模式结合对应的海量数据处理面试题分别具体阐述。 密匙一、分而治之/hash映射 + hash统计 + 堆/快速/归并排序 1、海量日志数据,提取出某日访问百度次数最多的那个IP。 既然是海量数据处理,那么可想而知,给我们的数据那就一定是海量的。针对这个数据的海量,我们如何着手呢?对的,无非就是分而治之/hash映射 + hash统计 + 堆/快速/归并排序,说白了,就是先映射,而后统计,最后排序: 分而治之/hash映射:针对数据太大,内存受限,智能是:把大文件化成(取模映射)小文件,即16字方针:大而化小,各个击破,缩小规模,逐个解决 hash统计:当大文件转化了小文件,那么我们便可以采用常规的hashmap(ip,value)来进行频率统计。 堆/快速排序:统计完了之后,便进行排序(可采取堆排序),得到次数最多的IP。 具体而论,则是: “首先是这一天,并且是访问百度的日志中的IP取出来,逐个写入到一个大文件中。注意到IP是32位的,最多有个2^32个IP。同样可以采用映射的方法,比如模1000