排序算法

排序算法--持续更新

≡放荡痞女 提交于 2020-03-17 10:54:16
参考文献: https://mp.weixin.qq.com/s/vn3KiV-ez79FmbZ36SX9lg (将参考文章java代码用c/c++改写) 排序算法可以分为 内部排序 和 外部排序 。 内部排序 是数据记录在内存中进行排序。 外部排序 是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。 常见的内部排序算法有: 插入排序 、 希尔排序 、 选择排序 、 冒泡排序 、 归并排序 、 快速排序 、 堆排序 、 基数排序 等。 关于时间复杂度: 平方阶 (O(n2)) 排序 各类简单排序:直接插入、直接选择和冒泡排序。 线性对数阶 (O(nlog2n)) 排序 快速排序、堆排序和归并排序; O(n1+§)) 排序,§ 是介于 0 和 1 之间的常数。 希尔排序 线性阶 (O(n)) 排序 基数排序,此外还有桶、箱排序。 关于稳定性: 稳定的排序算法:冒泡排序、插入排序、归并排序和基数排序。 不是稳定的排序算法:选择排序、快速排序、希尔排序、堆排序。 冒泡排序 1.对一组数相邻两数依次进行比较,若第一个比第二个大,则交换两数字,否则不交换; 2.依次比较换位到最后一位,则最后一位在一次排序中最大; 3.保持最后一位不动,进行第二次排序,排序完成后,最后两位依次最大; 4.进行第3.4…次排序,直到没有数字需要进行比较排序 代码: 来源: CSDN 作者

搜索旋转排序数组

喜夏-厌秋 提交于 2020-03-17 07:37:05
题目: 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。 搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。 你可以假设数组中不存在重复的元素。 你的算法时间复杂度必须是 O(log n) 级别。 示例 1: 输入 : nums = [ 4 , 5 , 6 , 7 , 0 , 1 , 2 ] , target = 0 输出 : 4 示例 2: 输入 : nums = [ 4 , 5 , 6 , 7 , 0 , 1 , 2 ] , target = 3 输出 : - 1 解题思路: 题目要求 O(log N)的时间复杂度,基本可以断定本题是需要使用二分查找,怎么分是关键。 由于题目说数字了无重复,举个例子: 1 2 3 4 5 6 7 可以大致分为两类, 第一类 2 3 4 5 6 7 1 这种,也就是 nums[start] <= nums[mid]。此例子中就是 2 <= 5。 这种情况下,前半部分有序。因此如果 nums[start] <=target<nums[mid],则在前半部分找,否则去后半部分找。 第二类 6 7 1 2 3 4 5 这种,也就是 nums[start] > nums[mid]。此例子中就是 6 > 2。 这种情况下

搜索旋转排序数组

蓝咒 提交于 2020-03-17 07:28:55
33. 搜索旋转排序数组 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。 搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。 你可以假设数组中不存在重复的元素。 你的算法时间复杂度必须是 O(log n) 级别。 示例 1: 输入: nums = [4,5,6,7,0,1,2], target = 0 输出: 4 示例 2: 输入: nums = [4,5,6,7,0,1,2], target = 3 输出: -1 1 public class T33 { 2 public int search(int[] nums, int target) { 3 int l = 0, r = nums.length - 1; 4 while (l <= r) { 5 int mid = (r - l) / 2 + l; 6 if (nums[mid] == target) { 7 return mid; 8 } else if (nums[mid] < nums[r]) { 9 if (nums[mid] < target && target <= nums[r]) { 10 l = mid + 1; 11 } else { 12 r = mid - 1;

day10【排序算法、异常】

最后都变了- 提交于 2020-03-17 05:55:03
day10【排序算法、异常】 今日内容 选择排序 二分查找 异常处理 教学目标 能够理解选择排序的执行原理 能够理解二分查找的执行原理 能够辨别程序中异常和错误的区别 说出异常的分类 列举出常见的三个运行期异常 能够使用try…catch关键字处理异常 能够使用throws关键字处理异常 能够自定义并使用异常类 第一章 选择排序 1.1 选择排序概述 另外一种排序的方式,选中数组的某个元素,其后面的元素依次和选中的元素进行两两比较,将较大的数据放在后面,依次从前到后选中每个元素,直至所有数据按要求完成排序 如果有n个数据进行排序,总共需要比较n-1次 每一次比较完毕,下一次的比较就会少一个数据参与 1.2 选择排序图解 1.3 选择排序代码实现 /* 选择排序: 另外一种排序的方式,选中数组的某个元素,其后面的元素依次和选中的元素进行两两比较,将较大的数据放在后面,依次从前到后选中每个元素,直至所有数据按要求完成排序 */ public class ArrayDemo { public static void main ( String [ ] args ) { //定义一个数组 int [ ] arr = { 7 , 6 , 5 , 4 , 3 } ; System . out . println ( "排序前:" + Arrays . toString ( arr ) ) ;

golang sort 包使用,及三个简单排序算法冒泡,插入,选择 练习

冷暖自知 提交于 2020-03-17 02:04:59
某厂面试归来,发现自己落伍了!>>> sort 包的核心类型是 sort.Interface: type Interface interface { // Len is the number of elements in the collection. Len() int // Less reports whether the element with // index i should sort before the element with index j. Less(i, j int) bool // Swap swaps the elements with indexes i and j. Swap(i, j int) } 接口 是golang 的很cool 的特性,rob pike 说接口有点类似uinx pipe,把不同的代码片段连接在一起,这个契约就是接口规范, 提供了指定的功能集合, 不管你的内部实现。var s sort.Interface, s 是抽象的接口类型, 具体类型u只要提供了 Len(), Less(), Swap(), s = u, 就可以把 u 型变量赋值s, 还体现在 函数函数 是 s, 返回值是s 的地方。 sort.Ints, sort.Float64s, sort.Strings, 都是库方便的包装,如 sort.Ints 是这样实现的:

Map集合面试题

自闭症网瘾萝莉.ら 提交于 2020-03-16 18:30:51
有可能问道你都知道哪些常用的Map集合?   HashMap、HashTable、LinkedHashMap、ConcurrentHashMap。 Collection集合接口和Map接口有什么关系?   没关系,Collection是List、Set父接口不是Map父接口。 HashMap是线程安全的吗?线程安全的Map都有哪些?性能最好的是哪个?   HashMap不是线程安全的。线程安全的有HashTable、ConcurrentHashMap、SynchronizedMap,性能最好的是ConcurrentHashMap。 使用HashMap有什么性能问题吗?   使用HashMap要注意避免集合的扩容,它会很耗性能,根据元素的数量给它一个初始大小的值。 HashMap的数据结构是怎样的?默认大小是多少?内部是怎么扩容的?   HashMap是数组和链表组成的,默认大小为16,当hashmap中的元素个数超过数组大小*loadFactor(默认值为0.75)时就会把数组的大小扩展为原来的两倍大小,然后重新计算每个元素在数组中的位置。 怎么按添加顺序存储元素?怎么按A-Z自然顺序存储元素?怎么自定义排序?   按添加顺序使用LinkedHashMap,按自然顺序使用TreeMap,自定义排序TreeMap(Comparetor c)。

Java十大排序基本信息

你说的曾经没有我的故事 提交于 2020-03-16 17:59:41
十大排序 基本信息 基本信息 十大排序:冒泡排序,选择排序,插入排序,快速排序,归并排序,堆排序,基数排序,希尔排序,桶排序,计数排序 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面; 不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面; 内排序:所有排序操作都在内存中完成; 外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行; 时间复杂度: 一个算法执行所耗费的时间。 空间复杂度:运行完一个程序所需内存的大小。 根据他们各自的实现原理以及效率将十大排序算法分为两大类: 非线性比较类排序:非线性是指算法的时间复杂度不能突破(nlogn),元素之间通过比较大小来决定先后顺序。 线性非比较类排序:算法的时间复杂度能够突破(nlogn),并且不通过比较来对元素排序 来源: CSDN 作者: 小白之歌 链接: https://blog.csdn.net/weixin_45489155/article/details/104891236

归并排序(JS代码)

不羁岁月 提交于 2020-03-16 12:29:46
归并操作(merge),也叫归并算法,指的是将两个顺序序列合并成一个顺序序列的方法。 如 设有数列{6,202,100,301,38,8,1} 初始状态:6,202,100,301,38,8,1 第一次归并后:{6,202},{100,301},{8,38},{1},比较次数:3; 第二次归并后:{6,100,202,301},{1,8,38},比较次数:4; 第三次归并后:{1,6,8,38,100,202,301},比较次数:4; 该算法采用经典的 分治 主要操作步骤: 1:把长度为n的输入序列分成两个长度为n/2的子序列; 2:对这两个子序列分别采用归并排序; 3:将两个排序好的子序列合并成一个最终的排序序列。 Array.prototype.mergeSort = function() { let merge = function(left, right) { let resArr = [] while(left.length && right.length) { // 这里shift()方法用于把数组的第一个元素从其中删除,并返回第一个元素的值。 if(left[0] < right[0]) { resArr.push(left.shift()) }else { resArr.push(right.shift()) } } return resArr.concat

笔记:排序算法之冒泡排序

泄露秘密 提交于 2020-03-15 15:35:54
排序算法有哪些? 假设有一个没有任何排列顺序的电话号码簿(或笔记本)。当需要添加联络人和电话时,你只能将其写在下一个空位上。假定你的联系人列表上有很多人。某天,你要找某个联系人及其电话号码。但是由于联系人列表没有按照任何顺序来组织,你只能逐个检查,直到找到那个你想要的联系人为止。那得花多长时间啊? 需要组织信息集,比如那些存储在数据结构里的信息。最常用的排序和搜索算法,如冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序等算法。 冒泡排序: 冒泡算法在所有排序算法中最简单。从运行时间的角度来看,冒泡排序是最差的。冒泡排序比较所有相邻的两个项,如果第一个比第二个大,则交换它们。元素项向上移动至正确的顺序,就好像气泡升至表面一样,冒泡排序因此得名。 function bubbleSort(array, compareFn = defaultCompare) { const { length } = array; // {1} for (let i = 0; i < length; i++) { // {2} for (let j = 0; j < length - 1; j++) { // {3} if (compareFn(array[j], array[j + 1]) === Compare.BIGGER_THAN) { // {4} swap(array, j, j +

选择排序算法和冒泡算法的区别

青春壹個敷衍的年華 提交于 2020-03-15 04:54:05
/选择排序法对数组中的n个数,由小到大排序 #include<stdio.h> main() { int n=10,i,b,a[10]; int sort(int array[],int n); // scanf("%d",&10); for(i=0;i<10;i++)//键盘输入数组元素 scanf("%d",&a[i]); sort(a,10);//调用函数 for(i=0;i<10;i++)//输出排序之后的函数 printf("%3d",a[i]); } //排序子函数错误!!!!这是冒泡的思想!!! //int sort(int array[],int n)//排序子函数 { int i,j,k,t; for(i=0;i<n-1;i++)//需要比较n-1次 { //k=i; for(j=i+1;j<n;j++)//第i次比较,与第i+1个数开始比较 { if(array[j]<array[i]) { t=array[i]; array[i]=array[j]; array[j]=t; } } } } //下面是正确的子函数 int sort(int array[],int n)//排序函数 { int i,j,k,t; for(i=0;i<n-1;i++)//需要比较n-1次 { k=i; for(j=i+1;j<n;j++)//第i次比较,与第i+1个数开始比较 if