日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

合并排序(Java)-解析

發(fā)布時(shí)間:2024/6/30 java 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 合并排序(Java)-解析 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

合并排序-解析


?  算法設(shè)計(jì)有很多方法,前面說(shuō)過(guò)的插入排序使用的是增量(incremental)方法:在排好子數(shù)組 A[ 1……j -1] 后,將元素 A[j] 插入,形成排好序的子數(shù)組 A[ 1……j]。

  這次,要介紹的是另一設(shè)計(jì)策略,叫做 “分治法(divide-and-conquer)。下面要用分治法來(lái)設(shè)計(jì)一個(gè)排序算法-合并排序(merge-sort),使其性能比插入排序好得多。


?

?


分治法

有很多算法在結(jié)構(gòu)上是遞歸的:為了解決一個(gè)給定的問(wèn)題,算法要一次或多次地遞歸調(diào)用其自身來(lái)解決相關(guān)的子問(wèn)題。這些算法通常采用分治策略:將原問(wèn)題劃分為 n 個(gè)規(guī)模較小而結(jié)構(gòu)與原問(wèn)題相似的子問(wèn)題;遞歸地解決這些子問(wèn)題,然后再合并其結(jié)果,就得到原問(wèn)題的解。

  分治模式在每一層遞歸上都有三個(gè)步驟:

  分解(divide):將原問(wèn)題分解成一系列子問(wèn)題;

  解決(conquer):遞歸地解決各個(gè)子問(wèn)題,若子問(wèn)題足夠小,則直接求解;

  合并(combine):將子問(wèn)題的結(jié)果合并成原問(wèn)題的解。

?


?

?

合并排序算法完全依照了上述模式,直觀地操作如下:

  分解:將 n 個(gè)元素分成各含 n/2 個(gè)元素的子序列;

  解決:用合并排序法對(duì)兩個(gè)子序列遞歸地排序;

  合并:合并兩個(gè)已排序的子序列以得到排序結(jié)果。

  在對(duì)子序列排序時(shí),其長(zhǎng)度為 1 時(shí)遞歸結(jié)束。單個(gè)元素被視為是已排好序的。


?

合并排序在數(shù)組

A = <5  2  4  7  1  3  2  6> 上的處理過(guò)程。隨著算法的處理過(guò)程由底向上進(jìn)展,待合并的已排序列長(zhǎng)度不斷增加。


?Java代碼:

1 import java.util.*; 2 3 public class Merge_Sort { 4 5 6 /* 7 ******************************開(kāi)始寫(xiě)代碼******************************/ 8 static void merge_Sort(int[] arr){ 9 int length = arr.length; 10 int mid = length/2; 11 if(length > 1){ 12 int[] left = Arrays.copyOfRange(arr, 0, mid);//復(fù)制左半部分 13 int[] right = Arrays.copyOfRange(arr, mid, length);//復(fù)制右半部分 14 merge_Sort(left);//遞歸左邊 15 merge_Sort(right);//遞歸右邊 16 merge(arr,left,right);//合并數(shù)組 17 } 18 } 19 20 static void merge(int[] result, int[] left, int[] right) { 21 int i = 0, l = 0, r = 0; 22 while(l < left.length && r < right.length){ 23 if(left[l] < right[r] ) 24 result[i++] = left[l++]; 25 else 26 result[i++] = right[r++]; 27 } 28 while(l < left.length){//若left數(shù)組剩余,則后面依次復(fù)制給result 29 result[i++] = left[l++]; 30 } 31 while(r < right.length){//反之 32 result[i++] = right[r++]; 33 } 34 } 35 /******************************結(jié)束寫(xiě)代碼******************************/ 36 37 38 public static void main(String[] args){ 39 Scanner in = new Scanner(System.in); 40 int[] res; 41 42 int _a_size = 0; 43 _a_size = Integer.parseInt(in.nextLine().trim());//輸入數(shù)組大小 44 int[] _a = new int[_a_size]; 45 int _a_item; 46 for(int _a_i = 0; _a_i < _a_size; _a_i++) { 47 _a_item = Integer.parseInt(in.nextLine().trim());//輸入數(shù)組 48 _a[_a_i] = _a_item; 49 } 50 51 merge_Sort(_a); 52 for(int _a_i=0; _a_i < _a.length; _a_i++) { 53 System.out.print(String.valueOf(_a[_a_i])+" "); 54 } 55 56 } 57 }

結(jié)果截圖:

?

?

PS:合并是一種穩(wěn)定的排序算法

堆排序、快速排序、希爾排序、直接選擇排序不是穩(wěn)定的排序算法,

而基數(shù)排序、冒泡排序、直接插入排序、折半插入排序、歸并排序是穩(wěn)定的排序算法。

?

?

?

?

?

轉(zhuǎn)載于:https://www.cnblogs.com/denglw/p/6807185.html

總結(jié)

以上是生活随笔為你收集整理的合并排序(Java)-解析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。