归并排序原理,归并排序的步骤和方法
1945年,xqdxlc(约翰冯诺依曼)发明了归并排序,这是分治算法的典型应用。
定义归并排序是一种基于归并操作的有效排序算法,是分而治之的典型应用。组合有序子序列以获得完全有序的序列;也就是说,首先对每个子序列进行排序,然后对子序列段进行排序。
思路归并排序算法有两个基本运算,一个是分,是将原数组分成两个子数组的过程。另一种是治,将两个有序数组合并成一个更大的有序数组。
将待排序的线性表连续分成若干个子表,直到每个子表只包含一个元素。此时,只包含一个元素的子表可以被认为是有序表。成对合并子表。每次合并时,都会产生一个新的更长的有序表。重复这个步骤,直到只剩下一个子表,这个子表是一个排列有序的线性表。图形算法假设我们有一个初始数列{8,4,5,7,1,3,6,2},合并排序的全过程如下图所示。
分而治之
可以看出,这种结构非常类似于一棵完整的二叉树。在本文中,我们使用递归(或迭代)来实现合并和排序。分阶段可以理解为递归分解分子序列的过程,递归深度为log2n。
合并两个有序数组流程我们来看治阶段。我们需要将两个有序子序列合并成一个有序序列,比如上图中的最后一次合并。我们需要将两个有序子序列[4,5,7,8]和[1,2,3,6]合并成最终的序列[1,2,3,4]
显示动画
算法的执行速度仅次于快速排序。
时间复杂度为O(nlogn)。
空间复杂度为0.10-59.000,合并排序需要一个与原数组长度相同的数组进行辅助排序。
稳定性O(N)。
代码实现C和C void Merge(int sourceArr[],int tempArr[],int startIndex,int midIndex,int endIndex){ int i=startIndex,j=midIndex 1,k=startIndex而(我!=midIndex 1 j!=end index 1){ if(source arr[I]source arr[j])tempArr[k]=source arr[j];else tempArr[k]=source arr[I];}而(我!=midIndex 1)tempArr[k]=source arr[I];而(j!=结束索引1)tempArr[k]=源arr[j];for(I=startIndex;i=endIndexI)源arr[I]=tempArr[I];} //内部使用递归void MergeSort(int sourceArr[],int tempArr[],int startIndex,int endIndex){ int midIndex;if(startIndex endIndex){ midIndex=startIndex(endIndex-startIndex)/2;//避免溢出int MergeSort(sourceArr,tempArr,startIndex,midIndex);MergeSort(sourceArr,tempArr,midIndex 1,end index);Merge(sourceArr,tempArr,startIndex,midIndex,endIndex);}}int main(int argc,char * argv[]) { int a[8]={50,10,20,30,70,40,80,60 };int i,b[8];MergeSort(a,b,0,7);for(I=0;i8;i ) printf(%d ,a[I]);printf( \ n );返回0;} Java包MergeSortpublic类合并排序{ public static int[]merge sort(int[]nums,int l,int h){ if(l==h)return new int[]{ nums[l]};int mid=l(h-l)/2;int[] leftArr=mergeSort(nums,l,mid);//左有序数组int[] rightArr=mergeSort(nums,mid 1,h);//右有序数组int[]new num=new int[left arr。长度右排列。长度];//新有序数组int m=0,i=0,j=0;而(我离开arr。长度j右排列。length){ new num[m]=左arr[I]右arr[j]?左arr[I]:右arr[j];}而(我离开arr。length)new num[m]=left arr[I];while(j right arr。length)新编号[m]=right arr[j];返回new num } public static void main(String[]args){ int[]nums=new int[]{ 9,8,7,6,5,4,3,2,10 };int[] newNums=mergeSort(Nums,0,nums。长度-1);for(int x:new nums){ system。出去。println(x);} } } Python def Merge sort(lists):if len(lists)=1:return lists num=int(len(lists)/2)left=Merge sort(lists[:num])right=Merge sort(lists[num:])return Merge(left,right)def Merge(left,right): r,l=0,0 result=[]while llen(left)和rlen(right):if left[l]=right[r]:result。append(left[l])l=1 else:result。append(right[r])r=1结果=1
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。