自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

數(shù)據(jù)結(jié)構(gòu)與算法:歸并算法

開(kāi)發(fā) 前端
歸并排序是建立在歸并操作上的一種有效,穩(wěn)定的排序算法。該算法是采用分治思想,將已有序的子序列合并,得到完全有序的序列;

一、分治思想

分治,就是分而治之,將一個(gè)大問(wèn)題分解成小的子問(wèn)題來(lái)解決。小的子問(wèn)題解決了,大問(wèn)題也就解決了。

分治算法一般都是用遞歸來(lái)實(shí)現(xiàn)的。分治是一種解決問(wèn)題的處理思想,遞歸是一種編程技巧。

二、歸并排序

歸并排序是建立在歸并操作上的一種有效,穩(wěn)定的排序算法。

該算法是采用分治思想,將已有序的子序列合并,得到完全有序的序列;

即先使每個(gè)子序列有序,再使子序列段間有序。若將兩個(gè)有序表合并成一個(gè)有序表,稱為二路歸并。

第一步:申請(qǐng)空間,使其大小為兩個(gè)已經(jīng)排序序列之和,該空間用來(lái)存放合并后的序列

第二步:設(shè)定兩個(gè)指針,最初位置分別為兩個(gè)已經(jīng)排序序列的起始位置

第三步:比較兩個(gè)指針?biāo)赶虻脑兀x擇相對(duì)小的元素放入到合并空間,并移動(dòng)指針到下一位置

重復(fù)步驟3直到某一指針超出序列尾。

三、歸并排序代碼實(shí)現(xiàn)

import java.util.*;

class MergeSort {
public static void main(String[] args) {
int[] arr = {5,7,4,2,0,3,1,6};
mergeSort(arr, 0, arr.length-1);
System.out.print(Arrays.toString(arr));
}
public static void mergeSort(int[] arr,int left,int right){
if(left>=right){
return;
}
int mid = (left + right) / 2;
//先將數(shù)組按照中間下標(biāo)分解成兩部分,遞歸直到分解每部分只有1個(gè)元素為止
mergeSort(arr, left, mid);
mergeSort(arr, mid+1, right);
//分解結(jié)束后,由下到上,遞歸合并已經(jīng)排序好的兩部分
merge(arr, left, mid, right);

}
//需要注意的是整個(gè)合并過(guò)程中并沒(méi)有將兩個(gè)被合并的數(shù)組單獨(dú)拎出來(lái),
//二者始終是存在于一個(gè)數(shù)組地址上的
public static void merge(int[] arr,int left,int mid,int right){
//根據(jù)拿到的左邊界,我們定其為第一個(gè)數(shù)組的指針
int s1 = left;
//根據(jù)中間位置,讓中間位置右移一個(gè)單位,那就是第二個(gè)數(shù)組的指針
int s2 = mid+1;
//根據(jù)左右邊界相減我們得到這片空間的長(zhǎng)度,以此聲明額外空間
int[] temp = new int[right - left+1];
//定義額外空間的指針
int i = 0;
while(s1<=mid && s2 <=right){
//如果第一個(gè)數(shù)組的指針數(shù)值小于第二個(gè)數(shù)組的,那么其放置在臨時(shí)空間上
if(arr[s1]<=arr[s2]){
temp[i++] = arr[s1++];
}else{//否則是第二個(gè)數(shù)組的數(shù)值放置于其上
temp[i++] = arr[s2++];
}
}
//如果這是s1仍然沒(méi)有到達(dá)其終點(diǎn),那么說(shuō)明它還有剩
while(s1<=mid){
//因?yàn)槲覀冎烂總€(gè)參與合并的數(shù)組都是有序數(shù)組,因此直接往后拼接即可
temp[i++] = arr[s1++];
}
while(s2<=right){//同上
temp[i++] = arr[s2++];
}
for(int j = 0;j<temp.length;j++){//數(shù)組復(fù)制
arr[j+left] = temp[j];
}
}

}

二、歸并排序復(fù)雜度

時(shí)間復(fù)雜度O(N*logN)

空間復(fù)雜度O (N)

穩(wěn)定性:穩(wěn)定

責(zé)任編輯:武曉燕 來(lái)源: 今日頭條
相關(guān)推薦

2021-04-16 09:40:52

Java數(shù)據(jù)結(jié)構(gòu)算法

2020-10-21 14:57:04

數(shù)據(jù)結(jié)構(gòu)算法圖形

2023-10-27 07:04:20

2023-04-27 09:13:20

排序算法數(shù)據(jù)結(jié)構(gòu)

2023-03-02 08:15:13

2023-03-10 08:07:39

數(shù)據(jù)結(jié)構(gòu)算法計(jì)數(shù)排序

2023-03-07 08:02:07

數(shù)據(jù)結(jié)構(gòu)算法數(shù)列

2021-05-12 09:07:09

Java數(shù)據(jù)結(jié)構(gòu)算法

2020-10-12 11:48:31

算法與數(shù)據(jù)結(jié)構(gòu)

2019-03-29 09:40:38

數(shù)據(jù)結(jié)構(gòu)算法前端

2023-03-13 10:08:31

數(shù)據(jù)結(jié)構(gòu)算法

2023-11-06 06:43:23

單鏈表查詢數(shù)據(jù)結(jié)構(gòu)

2017-08-31 09:45:43

JavaArrayList數(shù)據(jù)

2023-09-15 10:33:41

算法數(shù)據(jù)結(jié)構(gòu)

2023-02-08 07:52:36

跳躍表數(shù)據(jù)結(jié)構(gòu)

2023-10-30 08:31:42

數(shù)據(jù)結(jié)構(gòu)算法

2020-10-20 08:14:08

算法與數(shù)據(jù)結(jié)構(gòu)

2021-04-15 09:36:44

Java數(shù)據(jù)結(jié)構(gòu)算法

2020-12-31 05:31:01

數(shù)據(jù)結(jié)構(gòu)算法

2021-01-28 07:33:34

JavaScript鏈表數(shù)據(jù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)