排序算法总结

对第二章分治法的总结

…衆ロ難τιáo~ 提交于 2019-11-30 19:58:04
分治法是将较大规模的问题划分为较小规模的问题提高解决问题的效率。 二分法是分治法的一个特殊方法,通常和递归算法结合使用。 个人认为这个算法提供给我们一个新的解决问题的思路。 使用二分法的关键在于找到分解为子问题的方式,分解方式不同也会影响算法的效率,比如说二分排序中有合并排序和快速排序两种。虽然这两种排序方法的时间复杂度都是nlog(n),但是对于不同的数据,两者排序的效率还是有一定差别的。对于基本排好序的数据集来说,快速排序会比较高效一些。 来源: https://www.cnblogs.com/coding-specification-of-Java/p/11638636.html

面试常考各类排序算法总结.(c#) 原文来自https://www.cnblogs.com/geduocoding/p/7097870.html

半城伤御伤魂 提交于 2019-11-30 01:33:51
前言 面试以及考试过程中必会出现一道排序算法面试题,为了加深对排序算法的理解,在此我对各种排序算法做个总结归纳。 1、冒泡排序算法(BubbleSort) 1.1 算法描述 (1)比较相邻的元素。如果第一个比第二个大,就交换他们两个。 (2)对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 (3)针对所有的元素重复以上的步骤,除了最后一个。 (4)持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 最好时间复杂度O(n) 最坏时间复杂度O(n2) 1.2 动图演示 1.3 C#代码实现 public Class SortDemo { public void BubbleSort(int arr) { int temp=0; //需要走arr.Length-1 趟 for(int i=0;i<arr.Length-1;i++) { //每一趟需要比较次数 for(int j=0,j<arr.Length-i-1;j++) { //升序排序 if(arr[j]>arr[j+1]) { temp=arr[j];//将较大的变量保存在临时变量 arr[j]=arr[j+1]; arr[j+1]=temp; } } } } } 2、直接插入排序(InsertionSort) 2.1 算法描述 (1)从第一个元素开始

排序算法总结

会有一股神秘感。 提交于 2019-11-29 16:03:14
排序算法总结 整理自java知音 排序算法说明 排序的定义 对一序列对象根据关键字排序; 术语说明 稳定: 如果a原本在b前面,而a=b,排序之后a仍然在b的前面; 不稳定: 如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面; 内排序: 所有排序操作都在内存中完成; 外排序: 由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行; 时间复杂度: 一个算法执行所耗费的时间。 空间复杂度: 运行完一个程序所需内存的大小。 算法总结 图片名词解释: n: 数据规模 k: “桶”的个数 In-place: 占用常数内存,不占用额外内存 Out-place: 占用额外内存 冒泡排序 算法描述 比较相邻的元素。如果第一个比第二个大,就交换它们两个; 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数; 针对所有的元素重复以上的步骤,除了最后一个; 重复步骤1~3,直到排序完成; (注:每一次比较的结果是最大值) 动图演示 代码演示 /* 冒泡排序*/ public static int[] bubbleSort(int[] array) { if(array.length == 0 || array.length == 1) { return array; } /* 一个长度为N的数组需要冒泡N-1次*/ for

常用的比较排序算法总结

佐手、 提交于 2019-11-29 15:15:49
写在前面 一直很惧怕算法,总是感觉特别伤脑子,因此至今为止,几种基本的排序算法一直都不是很清楚,更别说时间复杂度、空间复杂度什么的了。 今天抽空理了一下,其实感觉还好,并没有那么可怕,虽然代码写出来还是磕磕绊绊,但是思想和原理还是大致上摸清楚了,记录、分享。 另一篇文章: 三种非比较排序算法总结 说明 关于排序,前辈们已经讲解的够多了,我这里主要摘录一些概念。 排序算法分类 比较排序,时间复杂度为O(nlogn) ~ O(n^2),主要有: 冒泡排序,选择排序,插入排序,归并排序,堆排序,快速排序 等 非比较排序,时间复杂度可以达到O(n),主要有: 计数排序,基数排序,桶排序 等 排序稳定性 排序算法稳定性的简单形式化定义为:如果Ai = Aj,排序前Ai在Aj之前,排序后Ai还在Aj之前,则称这种排序算法是稳定的。 常用排序算法总结(一) 关于时间复杂度和空间复杂度 选择排序 选择排序每次比较的是数组中特定索引的值与全数组中每个值的大小比较,每次都选出一个最小(最大)值,如果当前索引的值大于之后索引的值,则两者进行交换 // 分类 -------------- 内部比较排序 // 数据结构 ---------- 数组 // 最差时间复杂度 ---- O(n^2) // 最优时间复杂度 ---- O(n^2) // 平均时间复杂度 ---- O(n^2) // 所需辅助空间 --

常用排序算法总结(插入、冒泡、快速,堆、选择、希尔、归并)

旧街凉风 提交于 2019-11-29 08:59:29
对科研中常见的几种排序方法做个总结,方便日后查看与回顾。(对本人认为比较简单易懂的排序方法过程比较简略,对比较复杂的排序方法过程就比较详细) 编程语言: C++ (经过本人验证,可以正常运行)。 一、直接插入排序(稳定): 思想: “一趟一个“地将待排序记录插入到已经排好序的部分记录的适当位置中,使其成为一个新的有序序列,直到所有待排序记录全部插入完毕。 分析: 空间: 仅需使用一个辅助单元。故空间复杂度为O(1); 最好情况: 待排序序列已经有序,每趟操作只需比较1次和移动0次,此时,总的比较次数为n-1,总移动次数为0,故最好情况算法复杂度为O(n); 最坏情况: 待排序序列按逆序排序,这时在第j趟操作中,为插入元素需要同前面的j个元素比较,移动元素的次数为j+1.此时有:总的比较次数=1+2+...+(n-1)=n(n-1)/2;总移动次数=2+3+4+...+n=(n+2)(n-1)/2,故最坏情况算法复杂度为O(n^2); 平均情况: 在第j趟操作中,插入记录大约需要同前面j/2个元素比较,移动记录的次数为j/2+1次,此时总的比较次数约为n^2/4;总移动次数为n^2/4;故时间复杂度为O(n^2); 代码: void insertSort(int *a,int low,int high)//插入排序 { for(int i=low+1;i<high;i++) { if

算法学习总结(2)——温故十大经典排序算法

こ雲淡風輕ζ 提交于 2019-11-29 06:04:42
本文链接:https://blog.csdn.net/u012562943/article/details/100136531 一、什么是排序算法 1.1、排序定义 对一序列对象根据某个关键字进行排序。 1.2、排序术语 稳定 : 如果a原本在b前面,而a=b,排序之后a仍然在b的前面; 不稳定 :如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面; 内排序 :所有排序操作都在内存中完成; 外排序 :由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行; 时间复杂度 : 一个算法执行所耗费的时间。 空间复杂度 :运行完一个程序所需内存的大小。 1.3、算法总结 ​ ( 注意 :n指数据规模;k指“桶”的个数;In-place指占用常数内存,不占用额外内存;Out-place指占用额外内存) 1.4、算法分类 ​ 1.5、比较和非比较的区别 常见的 快速排序、归并排序、堆排序、冒泡排序 等属于 比较排序 。在排序的最终结果里,元素之间的次序依赖于它们之间的比较。每个数都必须和其他数进行比较,才能确定自己的位置 。在 冒泡排序 之类的排序中,问题规模为n,又因为需要比较n次,所以平均时间复杂度为O(n²)。在 归并排序、快速排序 之类的排序中,问题规模通过 分治法 消减为logN次,所以时间复杂度平均 O(nlogn) 。比较排序的优势是

排序算法总结

依然范特西╮ 提交于 2019-11-29 03:12:44
排序算法总结 package com.tulun.src06; /** @author Richard @date 2019/9/23 0023-10:33 *最简单的交换排序,效率极低 冒泡排序法 冒泡排序法2 冒泡排序法的优化:避免有序序列无意义的判断 简单的选择排序法 选择排序法的优化 插入排序 希尔排序2 插入排序2 插入排序3 希尔排序* */ public class OrderTest { public static void main(String[] args) { int[] array={2,5,4,3,1,0}; int[] arr={1,2,3,4,5,6}; //order(array); //Bubble(array); //Bubble(arr); //BubbleSort(array); //SelectSort(array); IncertOrder3(array); } public static void swap(int[] array,int i,int j){ int temp=array[i]; array[i]=array[j]; array[j]=temp; } public static void show(int[] array){ for (int i=0;i<array.length;i++){ System.out

C++算法之——常用算法总结

泄露秘密 提交于 2019-11-27 14:25:43
http://blog.sina.com.cn/s/blog_61bebe480100v7c7.html 基本的C++算法分为三类:排序算法、树算法、图算法 算法思想有三种:递推、分治、动态规划 以及 贪心算法。 本文将简要介绍上面三类算法,介绍时穿插介绍算法思想。 一、排序算法 1、基本O(n^2)排序算法: (对基本排序算法的时间复杂度分析主要考虑 比较次数、数据交换次数) 冒泡排序:针对数组、本地排序、需要交换数据。O(1)额外空间 选择排序:一般针对数组、本地排序、需要交换数据。O(1)的额外空间 插入排序:可以是针对数组的本地排序,此时需要移动大片数据,但是比较次数是O(N*logN)。如果是针对链表,比较次数是O(N^2),但是不需要交换数据。 注意:一般排序都是针对数组的本地排序,数组与链表相比,可以随机访问,空间使用效率更高(链表需要存放指针),而链表一般对于插入与删除操作有更好的性能。 2. O(N*logN)算法 快速排序:针对数组的本地排序,时间复杂度平均O(N*logN),最坏时O(N^2)。空间复杂度O(1) 归并排序:可以针对数组,也可以针对链表。针对数组时时间复杂度为O(N*logN),空间复杂度为O(N) 3. 堆排序 1991年计算机先驱奖获得者、斯坦福大学计算机科学系教授 罗伯特·弗洛伊德 (Robert W.Floyd)和威廉姆斯(J

十大排序算法总结

帅比萌擦擦* 提交于 2019-11-27 11:08:52
算法总结 详细十大排序算法: https://www.cnblogs.com/WindSun/category/1375215.html 图片名词解释: n: 数据规模 k: “桶”的个数 In-place: 占用常数内存,不占用额外内存 Out-place: 占用额外内存 算法的分类 比较和非比较的区别 常见的快速排序、归并排序、堆排序、冒泡排序等属于比较排序。在排序的最终结果里,元素之间的次序依赖于它们之间的比较。每个数都必须和其他数进行比较,才能确定自己的位置。 在冒泡排序之类的排序中,问题规模为n,又因为需要比较n次,所以平均时间复杂度为O(n²)。在归并排序、快速排序之类的排序中,问题规模通过分治法消减为logN次,所以时间复杂度平均O(nlogn)。 比较排序的优势是,适用于各种规模的数据,也不在乎数据的分布,都能进行排序。可以说,比较排序适用于一切需要排序的情况。 计数排序、基数排序、桶排序则属于非比较排序。非比较排序是通过确定每个元素之前,应该有多少个元素来排序。针对数组arr,计算arr之前有多少个元素,则唯一确定了arr在排序后数组中的位置。 非比较排序只要确定每个元素之前的已有的元素个数即可,所有一次遍历即可解决。算法时间复杂度O(n)。 非比较排序时间复杂度底,但由于非比较排序需要占用空间来确定唯一位置。所以对数据规模和数据分布有一定的要求。 [原文