归并排序首先把数组分成一半,想办法把左右两边数组排序,之后呢再将它们归并起来,这就是归并排序的基本思想。这样的话如果有N个元素,就会分成log(n)层,如果整个归并过程我们可以以O(n)时间复杂度解决的话,那么我们就设计成了一个Nlog(n)级别的排序算法。这个归并的过程需要O(n)的辅助空间,把两个已经排好序的数组合并成一个排序数组,整体呢需要三个索引在数组中追踪,其中蓝色的箭头表示最终在归并的过程中我们需要跟踪的位置,而俩个红色的箭头表示当前已经排好序的数组,分别指向当前要考虑的元素。首先我们要看1和2谁先放在最终数组中,显然1比2小所以我们首先把1放在最终数组中,这样蓝色箭头就可以考虑下
思想:就是在把关键字temp通过比较大小,插入到前面已经排好序的序列中,直到全部元素插入完成。实现步骤:是否为数组->数组是否为空默认序列下标0的数值为有序序列,而从下标1到末尾的元素temp构成无序序列temp和前面的有序序列进行依次比较,比较的同时也让有序序列往后移动,直到找到比temp大的元素,就找到要插入的位置。functioninsertSort(arr){//是否是数组if(Object.prototype.toString.call(arr).slice(8,-1)==='Array'){//数组是否为空varlen=arr.length;if(len===0){returnar
选择排序首先在这整个数组范围里找到最小的元素1,然后和第一名的位置交换,之后我们在剩下的部分再找最小的元素2,把2和第二名的位置来交换,以此类推。selectionSorttemplatevoidselectionSort(Tarr[],intn){for(inti=0;iarr[j]){minIndex=j;}}std::swap(arr[i],arr[minIndex]);}}优化//在每一轮中,可以同时找到当前未处理元素的最大值和最小值templatevoidselectionSort(Tarr[],constintn){intleft=0,right=n-1;while(leftarr
工作原理首先在未排序的序列中初始化,默认最小数值为未排序的序列的起始位置。即外层循环再从除起始位置与已排序元素的剩余未排序元素中继续寻找最小元素,然后交换起始位置的元素与最小元素,这个起始位置就成为了已排序序列的末尾元素。而且根据逻辑后面找到的第二小元素一定比最初找到的最小元素小。即内层循环然后继续外层循环,继续找未排序的序列,直到所有元素排序完毕。functionselectionSort(arr){letlen=arr.length;letminIndex,temp;console.time('选择排序耗时');//外层循环for(leti=0;i时间复杂度:\(O(n^2)\)空间复杂度
快速排序每次从当前考虑的数组中选一个元素,把这个元素想办法挪到应该排好序的位置,比如4这个元素,它就有一个性质4之前的元素都是小于它的,之后的元素都是大于它的,之后我们要做的事情是对小于4和大于4的数组分别继续使用快速排序的思路,逐渐递归下去完成整个排序过程。对于快速排序如果把选定的元素挪到正确的位置的过程也是快速排序的核心,在这个过程中我们通常选择数组第一个元素为我们分界的标志点,我们记录这个点为l,之后我们逐渐的遍历右边所有没有被访问的元素,在遍历的过程中我们逐渐整理一部分是小于v这个元素的,一部分是大于v这个元素的,当让我们要有个记录那个是小于v和大于v的分界点,这个点为j,而当前访问的
归并排序首先把数组分成一半,想办法把左右两边数组排序,之后呢再将它们归并起来,这就是归并排序的基本思想。这样的话如果有N个元素,就会分成log(n)层,如果整个归并过程我们可以以O(n)时间复杂度解决的话,那么我们就设计成了一个Nlog(n)级别的排序算法。这个归并的过程需要O(n)的辅助空间,把两个已经排好序的数组合并成一个排序数组,整体呢需要三个索引在数组中追踪,其中蓝色的箭头表示最终在归并的过程中我们需要跟踪的位置,而俩个红色的箭头表示当前已经排好序的数组,分别指向当前要考虑的元素。首先我们要看1和2谁先放在最终数组中,显然1比2小所以我们首先把1放在最终数组中,这样蓝色箭头就可以考虑下
思想:就是在把关键字temp通过比较大小,插入到前面已经排好序的序列中,直到全部元素插入完成。实现步骤:是否为数组->数组是否为空默认序列下标0的数值为有序序列,而从下标1到末尾的元素temp构成无序序列temp和前面的有序序列进行依次比较,比较的同时也让有序序列往后移动,直到找到比temp大的元素,就找到要插入的位置。functioninsertSort(arr){//是否是数组if(Object.prototype.toString.call(arr).slice(8,-1)==='Array'){//数组是否为空varlen=arr.length;if(len===0){returnar
选择排序首先在这整个数组范围里找到最小的元素1,然后和第一名的位置交换,之后我们在剩下的部分再找最小的元素2,把2和第二名的位置来交换,以此类推。selectionSorttemplatevoidselectionSort(Tarr[],intn){for(inti=0;iarr[j]){minIndex=j;}}std::swap(arr[i],arr[minIndex]);}}优化//在每一轮中,可以同时找到当前未处理元素的最大值和最小值templatevoidselectionSort(Tarr[],constintn){intleft=0,right=n-1;while(leftarr
工作原理首先在未排序的序列中初始化,默认最小数值为未排序的序列的起始位置。即外层循环再从除起始位置与已排序元素的剩余未排序元素中继续寻找最小元素,然后交换起始位置的元素与最小元素,这个起始位置就成为了已排序序列的末尾元素。而且根据逻辑后面找到的第二小元素一定比最初找到的最小元素小。即内层循环然后继续外层循环,继续找未排序的序列,直到所有元素排序完毕。functionselectionSort(arr){letlen=arr.length;letminIndex,temp;console.time('选择排序耗时');//外层循环for(leti=0;i时间复杂度:\(O(n^2)\)空间复杂度
前端面试高频笔试题,前端面试要做到提前准备提前练习,刷一定的面试题笔试题量,面试才能事半功倍一路畅通。1.实现快速排序vararr=[9,4,3,1,6,3,8,7]/***快速排序*@param{array}arr需要排序的数组*@returns{array}*/functionquickSort(arr){if(arr.length步骤分析:首先设定一个分界值,通过该分界值将数组分成左右两部分。将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于分界值,而右边部分中各元素都大于或等于分界值。然后,左边和右边的数据可以独立排序。对于左侧的数组