排序算法

十大排序算法基础1

偶尔善良 提交于 2020-02-29 15:27:20
学习链接: https://www.cnblogs.com/onepixel/p/7674659.html 1. 排序算法的分类 2. 排序算法的复杂度 3.相关概念 稳定 :如果a原本在b前面,而a=b,排序之后a仍然在b的前面。 不稳定 :如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。 时间复杂度 :对排序数据的总的操作次数。反映当n变化时,操作次数呈现什么规律。 空间复杂度 :是指算法在计算机内执行时所需存储空间的度量,它也是数据规模n的函数。 来源: CSDN 作者: 雨瑜 链接: https://blog.csdn.net/weixin_43584807/article/details/104570974

图文并茂!一文教你掌握九大排序算法之直接选择排序

旧巷老猫 提交于 2020-02-29 10:00:05
目录 1. 直接选择排序原理介绍 2. 流程图 2. 代码实现(Java) 1. 直接选择排序原理介绍 以升序为例,直接选择排序每一轮都会从未排序的数组元素中选出一个最小值放到已排序数组的末尾处,直到整个数组有序,选择排序是一种非常简单明了的排序算法,无论在任何情况下其时间复杂度都为O(n^2),所以用到这个排序算法时,数据规模应尽量小。 2. 流程图 2. 代码实现(Java) /** * @author Zeng * @date 2020/2/28 23:41 */ public class SelectSort { public static void swap(int[] arr, int i, int j){ int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } public static void selectSort(int[] arr){ for (int i = 0; i < arr.length; i++){ int index = i; for (int j = i + 1; j < arr.length; j++){ if(arr[index] > arr[j]){ index = j; } } swap(arr, i, index); System.out.print("第"+(i+1)+"轮排序结果:"

Python之冒泡排序和选择排序的比较

大兔子大兔子 提交于 2020-02-29 02:14:49
个人有时候会把冒泡排序和选择排序搞混了,因为感觉它们之间的差别也没太大,如下是冒泡排序Python的代码: class BubbleSort: def __init__(self): self.initArr() def initArr(self): self.arrInfo = [60, 61, 27, 91, 92, 44, 13, 20, 24, 14] def bubbleSortFromStartToEnd(self): length = len(self.arrInfo) for i in range(length): for j in range(length-i-1): if self.arrInfo[j] > self.arrInfo[j+1]: tmp = self.arrInfo[j] self.arrInfo[j] = self.arrInfo[j+1] self.arrInfo[j+1] = tmp def bubbleSortFromEndToStart(self): length = len(self.arrInfo) for i in range(0,length): for j in range(length-1,i,-1): if self.arrInfo[j] < self.arrInfo[j-1]: tmp = self.arrInfo[j]

大数据处理面试题

假装没事ソ 提交于 2020-02-29 01:57:58
1. 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url? 方an1:可以估计每个文件安的大小为50G×64=320G,远远大于内存限制的4G。所以不可能将其完全加载到内存中处理。kao虑采取分而治之的方法。 s 遍历文件a,对每个url求取 ,然后根据所取得的值将url分别存储到1000个小文件(记为 )中。这样每个小文件的大约为300M。 s 遍历文件b,采取和a相同的方式将url分别存储到1000各小文件(记为 )。这样处理后,所有可能相同的url都在对应的小文件( )中,不对应的小文件不可能有相同的url。然后我们只要求出1000对小文件中相同的url即可。 s 求每对小文件中相同的url时,可以把其中一个小文件的url存储到hash_set中。然后遍历另一个小文件的每个url,看其是否在刚才构建的hash_set中,如果是,那么就是共同的url,存到文件里面就可以了。 方an2:如果允许有一定的错误率,可以使用Bloom filter,4G内存大概可以表示340亿bit。将其中一个文件中的url使用Bloom filter映射为这340亿bit,然后挨个读取另外一个文件的url,检查是否与Bloom filter,如果是,那么该url应该是共同的url(注意会有一定的错误率)。 2. 有10个文件,每个文件1G

排序算法六:快速排序

☆樱花仙子☆ 提交于 2020-02-28 23:58:21
排序效率在同为O(N*logN)的几种排序方法中效率较高 思想: 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 平均时间复杂度: nlog2n ,空间复杂度: log2n,不稳定 public class QuickSort { /** * 快速排序 * @param arr:数组名 * @param leftbound:数组的起始下标 * @param rightbound:数组的结束下标 */ public void sort ( int [ ] arr , int leftbound , int rightbound ) { if ( leftbound >= rightbound ) return ; int mid = partition ( arr , leftbound , rightbound ) ; //轴的位置 sort ( arr , leftbound , mid - 1 ) ; //对轴前面的数进行快排 sort ( arr , mid + 1 , rightbound ) ; //对轴后面的数进行快排 } /** * 将数与轴的位置的数进行大小比较,小的数在轴的前面,大的数在轴的后面 * 左

排序算法一:选择排序

浪子不回头ぞ 提交于 2020-02-28 23:29:24
最简单也最没用的一种算法,时间复杂度为O(n²),而且不稳定,工程中一般不用… 思想:指定一个当前最小数(一般选第一个数),记录其下标为minpos,将它与后面的每一个数依次比较,若有数小于当前最小数,则交换两者的下标,并交换两个数的位置,重复上述步骤直到排好序 平均时间复杂度:O(n²),空间复杂度:1,不稳定 public class Test { public static void main ( String [ ] args ) { int [ ] arr = { 2 , 5 , 6 , 2 , 1 , 4 , 3 , 7 , 6 } ; for ( int i = 0 ; i < arr . length - 1 ; i ++ ) { int minpos = i ; //假定当前最小数为第一个数,定义当前下标 for ( int j = i + 1 ; j < arr . length ; j ++ ) { //从第二个数开始依次与最小数比较 if ( arr [ j ] < arr [ minpos ] ) { minpos = j ; //若后面的数小于当前最小数,则交换二者下标 } } int temp = arr [ i ] ; //将此时的最小数与原最小数交换 arr [ i ] = arr [ minpos ] ; arr [ minpos ] =

排序算法五:归并排序

江枫思渺然 提交于 2020-02-28 23:19:59
效率仅次于快排的一种排序算法, 一般用于对总体无序,但是各子项相对有序的数列 思想: 采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序 平均时间复杂度为 nlog2n ,空间复杂度为n,稳定 public class Merge { /** * 对数组进行排序 * @param arr:要排序的数组 * @param left:数组的开始下标 * @param right:数组的终止下标 */ public void sort ( int [ ] arr , int left , int right ) { if ( left == right ) return ; int mid = ( left + right ) / 2 ; //记录中间位置下标,将数组分成两半 sort ( arr , left , mid ) ; //左边排序 sort ( arr , mid + 1 , right ) ; //右边排序 merge ( arr , left , mid + 1 , right ) ; } /** *归并排序 * @param arr:要排序的数组 * @param leftptr:排序的左指针 * @param rightptr:排序的右指针 * @param bound:边界 */ public

【技术分享】一:搜索排序—概述

妖精的绣舞 提交于 2020-02-28 16:15:06
本文原作者:彭江军,经授权后发布。 原文链接: https://cloud.tencent.com/developer/article/1523867 1: 搜索排序的概念 搜索排序:在一次会话中,用户在交互界面输入需要查询的query,系统给返回其排好序的doc例表的过程。 2:搜索排序和推荐排序的区别 推荐:基于用户的行为挖掘出用户的兴趣,为其推荐对应的视频,doc等。 2.1从展示形式来讲: 搜索排序每次展示一系列的消息例表,如下图所示: 推荐每次可以展示一条消息,但是我们看到的这条可以被展示的doc也是经过背后的排序算法得到的。 也可以在界面上一次展示多条doc,这种情况下推荐排序的展示形式也是多条和搜索排序没有本质的区别。如腾讯视频的火锅视频的推荐就是一次展示多个视频,在这种情况下展示的顺序就由推荐的排序算法给出的。 2.2 难度上而言: 排序相比推荐而言,用户有一个较为明确的目的,所以在排序的初级阶段该问题的难度并不高。但搜索排序在后期的优化上面难度也很大。 前期,因为即使单纯的依据内容与query的文本相关性、内容的质量和内容的时新就可以给出一个还不错的排序结果。但是在基础的排序上在想来提升用户的体验,提升体验包括挖掘用户的意图,提高用户的点击率,长点击率等就比较困难。 由于不管是推荐还是搜索最后都离不开排序,下面结合自己的经验和项目写一点对排序的理解。 3

Python实现排序算法——交换排序

 ̄綄美尐妖づ 提交于 2020-02-28 15:10:12
一、冒泡排序 def bubble_sort ( values ) : """冒泡排序""" for i in range ( len ( values ) - 1 ) : #冒泡趟数 flag = False #表示本趟冒泡是否发生交换的标志 for j in range ( len ( values ) - i - 1 ) : #一趟冒泡过程 if values [ j ] > values [ j + 1 ] : #若为逆序 values [ j ] , values [ j + 1 ] = values [ j + 1 ] , values [ j ] #交换values[j]和values[j+1] flag = True if not flag : #本趟遍历后没有发生交换,说明表已经有序 print ( values ) return print ( values ) 二、快速排序 def quick_sort ( values , low , high ) : """快速排序""" if low < high : #递归跳出条件 base = division ( values , low , high ) #划分 quick_sort ( values , low , base - 1 ) #依次对两个子表进行递归排序 quick_sort ( values ,

排序--选择排序Selection Sort Java实现

痴心易碎 提交于 2020-02-28 14:21:56
基本原理 选择排序的简单原理:选择排序算法通过从未排序部分重复查找最小元素(考虑升序)并将其放在开头来对数组进行排序。 将数组两个子数组: 已排序子数组 未排序子数组 选择排序中每次循环都会从未排序子数组中选取最小元素放入已排序子数组 小例子 排序数组:[2,3,6,2,7,5,1,4] 第一次循环: 将[2,3,6,2,7,5,1,4]中最小元素,放到开头 结果:[ 1 ,3,6,2,7,5,2,4] 第二次循环: 将[3,6,2,7,5,2,4]中最小元素,放到开头 结果:[1, 2 ,6,3,7,5,2,4] 第三次循环: 将[6,3,7,5,2,4]中的最小元素,放到开头 结果:[1,2, 2 ,3,7,5,6,4] 第四次循环: 将[3,7,5,6,4]中的最小元素,放到开头 结果:[1,2,2, 3 ,7,5,6,4] 第五次循环: 将[7,5,6,4]中的最小元素,放到开头 结果:[1,2,2,3, 4 ,5,6,7] 第六次循环: 将[5,6,7]中的最小元素,放到开头 结果:[1,2,2,3,4, 5 ,6,7] ... 最后排序结果:[1,2,2,3,4,5,6,7] 有序子数组不断扩大,无序子数组不断缩小,最终整个数组都是有序数组 代码实现Java public static int[] Sort(int[] array){ //记录数组长度 int