Merge Sort é um algoritmo de classificação eficaz e estável baseado em operações de mesclagem. Este algoritmo é uma aplicação muito típica do método dividir e conquistar .
A classificação por mesclagem combina duas subsequências ordenadas para obter uma sequência completamente ordenada, ou seja, primeiro classifique cada subsequência e, em seguida, classifique os segmentos da subsequência. Se duas listas ordenadas forem mescladas em uma lista ordenada, chamaremos isso de mesclagem bidirecional .
A velocidade da classificação por mesclagem perde apenas para a classificação rápida e a complexidade do tempo é O (nlogn). O processo de divisão usa a ideia de dicotomia, que é um processo recursivo. Para reduzir o problema de abertura contínua de espaço durante o processo recursivo, podemos primeiro abrir um espaço temporário antes de mesclar e classificar, e usar esse espaço. uniformemente durante o processo recursivo. Basta mesclar.
Por exemplo:
importjava.util.Arrays;publicclassMain{publicstaticvoidmain(String[]args){int[]arr=newint[]{86,23,7,45,19,10};intleft=0;intright=arr.length-1; int[]tem=Arrays.copyOf(arr,arr.length);print(arr);mergeSort(arr,esquerda,r right,tem);print(arr);}publicstaticvoidmergeSort(int[]arr,intleft,intright,int[]tem){if(direita-esquerda<1){return;}intmid=esquerda+(direita-esquerda)/2 ;mergeSort(arr,esquerda,meio,tem);mergeSort(arr,meio+1,direita,tem);merge(arr,esquerda,meio ,direita,tem);}privatestaticvoidmerge(int[]arr,intleft,intmid,intright,int[]tem){intindex=0;intl=esquerda,r=mid+ 1;while(l<=mid&&r<=right){if(arr[l]<arr[r]){tem[index++]=arr[l++];}else{tem[index++]=arr[r++];} }while(l<=mi d){tem[index++]=arr[l++];}while(r<=right){tem[index++]=arr[r++];}for(inti=0;i<(right-left+1);i++ ){arr[esquerda +i]=tem[i];}}privatestaticvoidprint(int[]arr){for(inti:arr){System.out.print(i+t);}System.out.println();}}
Os resultados da execução são os seguintes:
8623745191071019234586