排序算法

经典排序算法的 javascript 实现

家住魔仙堡 提交于 2020-03-26 00:19:07
排序的稳定性:相等的几个元素在排序之后,其相对的先后顺序不变,则称该排序算法为稳定的。 排序算法是否为稳定的是由具体算法决定的, 不稳定的算法在某种条件下可以变为稳定的算法, 而稳定的算法在某种条件下也可以变为不稳定的算法。 稳定的排序算法:冒泡排序、插入排序、归并排序、基数排序、统计排序 不稳定的排序算法:选择排序、快速排序、希尔排序、堆排序 内部排序:直接在原数据结构上交换元素的值来达成排序 算法仅针对数值元素排序,某些算法仅适用于非负整数或大于0的整数; 在 js 中 undefined 的不等式运算返回 false, 因此有些比较操作执行前没有给变量赋初值也没有检查数组越界, 翻译成其他编程语言时需要注意 算法的描述参考下文 @kkun: http://www.cnblogs.com/kkun/archive/2011/11/23/2260312.html addr: http://www.cnblogs.com/ecalf/archive/2013/04/15/3022193.html author: ecalf 有错误和缺陷的地方希望大家指出来 //冒泡排序 function BubbleSort(arr){ for(i=0;i<arr.length;i++){ for(j=0;j<arr.length-1-i;j++){ var temp; if(arr[j]>arr

java各种排序算法及实现

不羁岁月 提交于 2020-03-26 00:18:44
3 月,跳不动了?>>> 先来看看8种排序之间的关系: 下图是各种排序的比较: 1, 直接插入排序 (1)基本思想:在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排 好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数 也是排好顺序的。如此反复循环,直到全部排好顺序。 在插入算法中,如果有一个最小的数在数组的最后面,用插入算法就会从最后一个 位置移动到第一个。 (2)实例 package cglib; public class StringNumber { public static void insertSort(int[] a) { if (a == null || a.length < 2) { return; } int length=a.length; //数组长度 int j; //当前值的位置 int i; //指向j前的位置 int key; //当前要进行插入排序的值 //从数组的第二个位置开始遍历值 for(j=1;j<length;j++){ key=a[j]; i=j-1; System.out.println(" 将i="+i); //a[i]比当前值大时,a[i]后移一位,空出i的位置,好让下一次循环的值后移 while(i>=0 && a[i]>key){ System.out.println("进 i="+i); a[i+1]

[算法分析]计数排序

|▌冷眼眸甩不掉的悲伤 提交于 2020-03-26 00:11:51
1. 计数排序的思想 我们之前接触过的例如:插入排序,归并排序,快速排序,堆排序等都是基于集合元素之间的比较这一基本的思想,它们执行的时间复杂度最优是趋于O(nlgn),而计数排序的运行机制不是基于集合元素之间的大小比较,什么???不做比较还能区分出元素之间的大小?是啊,算法就是这么伟大,我刚看它的时候也是激动不已呢。 计数排序的基本思想是:对每一个输入元素 x ,确定出小于 x 的元素个数。有了这一信息,就可以把 x 直接放到它在最终输出数组的位置上。 2. 计数排序的空间代价,假设原数组为:a[ 1...n ] 数组c[ k ] :提供临时存储区。这里 k 的定义为:a数组中每个元素都是介于 0 到 k 之间的整数,也可以将 k 想象成数组a中的最大值。 数组b[ n ] :存放排序结果。 注:这是一般的计数排序的空间消耗,我们可以通过一种方式,将这里存放排序结果的b数组省去,直接将最终排序的结果存在原数组a中,这个会在下面提到。 3. 计数排序的适用条件 计数排序是一个算法时间复杂度为θ( n )的排序方法,它适用于小范围集合的排序。这里的小范围是指 k = O(n),即 k 值不能太大。比如:我们要对全国高考学生的数学成绩进行排名,这里我们已经知道数学成绩是介于:0-150之间的,即这里的 k = 150 的,而高考学生的数量在900多万左右,这样的情况下可以达到很好的性能

详解选择排序算法

核能气质少年 提交于 2020-03-25 10:12:54
基本思想 选择排序的思想是: 给定一个数组arr,其长度为n; 第一次从 arr[0] 到 arr[n-1] 中选取一个最值(按照需求,可以是最大值,可以是最小值,下同)与arr[0]进行交换; 第二次从arr[1] 到 arr[n-1] 中选取一个最值与arr[1]进行交换; 以此类推,直到arr[n-2]到arr[n-1]中选出最值交换后即完成排序。(只剩下一个元素,前面的都是比它小(或者大)的)。 例子 给定数组 arr 为 [ 300, 50 , 120 , 110 ]; 则其初始状态为: 定义两个变量 minIndex 、 min ,分别表示最小值元素的索引,和最小值元素的值。 先假定最小值元素为循环开始的第一个元素。 第一次循环将 minIndex 、 min 分别赋值为 0 和 300 。 循环变量为当前元素的下一个元素的索引。 由图来演示算法过程: 黄色表示当前循环需要遍历的元素。 第一趟排序 此时 50 < min当前值300 ,将 minIndex赋值为1 ,将 min赋值为50 ; 循环变量向后移动。 此时 120 > min当前值50 ,循环变量直接向后移动; 此时 110 > min当前值50 ,循环变量无法向后移动,当前循环结束。 minIndex不等于循环开始前的首元素的索引0 ,发生交换。 第二趟排序 此时 120 > min当前值100

选择排序

ⅰ亾dé卋堺 提交于 2020-03-25 09:05:06
问题描述: 通过选择排序,从小到大排序一个数组。 算法实现: public static void selectSort(int[] arr) { for(int i = 0; i < arr.length - 1; i++) { int min = arr[i]; int minIndex = i; for(int j = i + 1; j < arr.length; j++) { if(arr[j] < min) { min = arr[j]; minIndex = j; } } if(min < arr[i]) { int temp = arr[i]; arr[i] = min; arr[minIndex] = temp; } }} 算法解析: 1.从未排序数组的第一个元素开始,假设当前值为最小值; 2.在假设最小值元素的下一个元素开始遍历,直到数组末尾,看是否有更小的值,如果有则交换; 3.上一个步骤结束后,数组中会增加一个有序的元素,继续未排序数组的设置比较过程(重复步骤1、2); 4.遍历、比较、交换结束,数组有序。 来源: https://www.cnblogs.com/heibingtai/p/12563834.html

PHP面试:写出常见的排序算法,并用PHP实现冒泡排序

£可爱£侵袭症+ 提交于 2020-03-24 13:25:30
面试中,涉及算法相关的考点并不多,因为在实际工作中PHP涉及的算法都很简单,但也会出现在一些笔试中,用于考察面试者的基本功,其中考察最多的就是排序算法,而对 冒泡排序的理解和实现 更是重中之重。 常见排序算法 冒泡排序 直接插入排序 希尔排序 选择排序 堆排序 归并排序 常考题:以上哪个算法的效率更快?(如果有 归并排序 优先选择,没有的话,选择 快速排序) 冒泡排序的原理 两两相邻的数进行比较,如果反序就交换,否则不交换。 时间复杂度:O(n^2) 空间间复杂度:O(1) 冒泡排序的实现 for ($i=0, $c=count($arr); $i < $c ; $i++) { for ($j=0; $j < $c-1; $j++) { if($arr[$j] > $arr[$j+1]){ $temp = $arr[$j]; $arr[$j] = $arr[$j+1]; $arr[$j+1] = $temp; } } } 来源: https://www.cnblogs.com/jiaoran/p/12558252.html

选择排序(java)

旧街凉风 提交于 2020-03-24 06:59:52
选择排序的思想是:内外两层循环,第一层循环从第一个数开始到倒数第一个数, 第二层循环从上一层的数开始, 与上一层循环的数比较,如果小于则交换位置、 代码如下: public class SelectSort { public int[] sort(int[] arrays) { int temp = arrays[0]; for (int i = 0; i < arrays.length - 1; i++) { for (int j = i + 1; j < arrays.length; j++) { if (arrays[j] <= arrays[i]) { temp = arrays[i]; arrays[i] = arrays[j]; arrays[j] = temp; } } } return arrays; } } 测试类如下: package Test; import org.omg.CORBA.Current; import bubbleSort.BubbleSort; import insertSort.InsertSort; import quickSort.QuickSort; import selectSort.SelectSort; public class Test { public static void main(String[] args) {

【算法】计数排序、桶排序和基数排序详解

。_饼干妹妹 提交于 2020-03-23 20:37:02
01.计数排序、桶排序与基数排序 并不是所有的排序 都是基于比较的,计数排序和基数排序就不是。基于比较排序的排序方法,其复杂度无法突破 \(n\log{n}\) 的下限,但是 计数排序 桶排序 和基数排序是分布排序,他们是可以突破这个下限达到O(n)的的复杂度的 。 1. 计数排序 概念 计数排序是一种稳定的线性时间排序算法。计数排序使用一个额外的数组 C ,使用 C[i] 来计算 i 出现的次数。然后根据数 C 来将原数组A中的元素排到正确的位置。 复杂度 计数排序的最坏时间复杂度、最好时间复杂度、平均时间复杂度、最坏空间复杂度都是 O(n+k) 。n为元素个数,k为待排序数的最大值。 优缺点 计数排序不是比较排序,排序的速度优于任何比较排序算法。由于用来计数的数组C的长度取决于待排序数组中数据的范围(等于待排序数组的最大值与最小值的差加1), 这使得对于数组中数据范围很大的数组,需要大量的时间和内存。 (简言之,不适于大范围数组) 通俗地理解,例如有10个年龄不同的人,统计出有8个人的年龄比A小,那A的年龄就排在第9位,用这个方法可以得到其他每个人的位置,也就排好了序。当然,年龄有重复时需要特殊处理(保证稳定性),这就是为什么最后要反向填充目标数组,以及将每个数字的统计减去1的原因。算法的步骤如下: 找出待排序数组中的最大元素和最小元素。 统计数组中值为 i 的元素出现的次数

排序算法(java版)

半腔热情 提交于 2020-03-23 20:34:41
1. 冒泡算法 2. 快速排序 3. 归并排序 4. 选择排序 5. 堆排序 排序算法 重要性不言而喻,很多算法问题往往选择一个好的排序算法往往问题可以迎刃而解 1、冒泡算法 冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。也就是双重循环就可以搞定的问题但是需要注意下一边界 算法步骤: 1)比较相邻的元素。如果第一个比第二个大,就交换他们两个。 2)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。 3)针对所有的元素重复以上的步骤,除了最后一个。 4)持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 1 public void BubbleSort(int[] a) { 2 int temp = 0; 3 int len = a.length; 4 for (int i = 0; i < len; i++) { 5 for (int j = 1; j < len - i; j++) 6 if (a[j - 1] > a[j]) { 7 //注意分清是a[j-1]还是a[j

Top K算法

我的未来我决定 提交于 2020-03-23 17:52:10
Top K算法 问题描述 : 从arr[1, n]这n个数中,找出最大的k个数,这就是经典的TopK问题。 栗子 : 从arr[1, 12]={5,3,7,1,8,2,9,4,7,2,6,6} 这n=12个数中,找出最大的k=5个。 一、排序 排序是最容易想到的方法,将n个数排序之后,取出最大的k个,即为所得。 伪代码 : sort(arr, 1, n); return arr[1, k]; 时间复杂度 :O(n*lg(n)) 分析 :明明只需要TopK,却将全局都排序了,这也是这个方法复杂度非常高的原因。那能不能不全局排序,而只局部排序呢?这就引出了第二个优化方法。 二、局部排序 不再全局排序,只对最大的k个排序。 冒泡是一个很常见的排序方法,每冒一个泡,找出最大值,冒k个泡,就得到TopK。 伪代码 : for(i=1 to k){ ​ bubble_find_max(arr,i); } return arr[1, k]; 时间复杂度 :O(n*k) 分析 :冒泡,将全局排序优化为了局部排序,非TopK的元素是不需要排序的,节省了计算资源。不少朋友会想到,需求是TopK,是不是这最大的k个元素也不需要排序呢?这就引出了第三个优化方法。 三、堆 思路 :只找到TopK,不排序TopK。 先用前k个元素生成一个小顶堆,这个小顶堆用于存储,当前最大的k个元素。 接着,从第k