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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

漫画:什么是归并排序?

發布時間:2025/3/11 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 漫画:什么是归并排序? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

—————? 第二天? —————

————————————

舉個例子,有A、B、C、D、E、F、G、H一共8個武術家參考參加比武大會。

第一輪,兩兩一組,有4名選手勝出(四分之一決賽)

第二輪,兩兩一組,有兩名選手勝出(半決賽)

第三輪,僅剩的兩人一組,冠軍勝出(總決賽)

歸并排序和擂臺賽,有什么相同和不同之處呢?讓我們以下面這個數組來舉例說明:

歸并排序就像是組織一場元素之間的“比武大會”,這場比武大會分成兩個階段:

1.分組

假設集合一共有n個元素,算法將會對集合進行逐層的折半分組。

第一層分成兩個大組,每組n/2個元素;

第二層分成4個小組,每組n/4個元素;

第三層分成8個更小的組,每組n/8個元素;

......

一直到每組只有一個元素為止。

這樣一來,整個數組就分成了一個個小小的“擂臺”。

2.歸并

既然分了組,接下來就要開始“比武”了。

歸并排序和擂臺賽有一個很大的不同,就是擂臺賽只需要決定誰是老大,而并不關心誰做老二和老三;歸并排序的要求復雜一些,需要確定每一個元素的排列位置。

因此,當每個小組內部比較出先后順序以后,小組之間會展開進一步的比較和排序,合并成一個大組;大組之間繼續比較和排序,再合并成更大的組......最終,所有元素合并成了一個有序的集合。

這個比較與合并的過程叫做歸并,對應英文單詞merge,這正是歸并排序名字的由來。

歸并操作需要哪三個步驟呢?我們以兩個長度為4的集合為例:

第一步,創建一個額外大集合用于存儲歸并結果,長度是兩個小集合之和。(p1,p2,p是三個輔助指針,用于記錄當前操作的位置)

第二步,從左到右逐一比較兩個小集合中的元素,把較小的元素優先放入大集合。

由于1<2,所以把元素1放入大集合,p1和p各右移一位:

由于2<3,所以把元素2放入大集合,p2和p各右移一位:

由于3<7,所以把元素3放入大集合,p1和p各右移一位:

由于5<7,所以把元素5放入大集合,p1和p各右移一位:

由于6<7,所以把元素6放入大集合,p1和p各右移一位:

此時左側的小集合已經沒有元素可用了。

第三步,從另一個還有剩余元素的集合中,把剩余元素按順序復制到大集合尾部。

這樣一來,兩個有序的小集合就歸并成了一個有序的大集合。

static public void mergeSort(int[] array, int start, int end){if(start < end){//折半成兩個小集合,分別進行遞歸int mid=(start+end)/2;mergeSort(array, start, mid);mergeSort(array, mid+1, end);//把兩個有序小集合,歸并成一個大集合merge(array, start, mid, end);} } static private void merge(int[] array, int start, int mid, int end){//開辟額外大集合,設置指針int[] tempArray = new int[end-start+1];int p1=start, p2=mid+1, p=0;//比較兩個小集合的元素,依次放入大集合while(p1<=mid && p2<=end){if(array[p1]<=array[p2])tempArray[p++]=array[p1++];elsetempArray[p++]=array[p2++];}//左側小集合還有剩余,依次放入大集合尾部while(p1<=mid)tempArray[p++]=array[p1++];//右側小集合還有剩余,依次放入大集合尾部while(p2<=end)tempArray[p++]=array[p2++];//把大集合的元素復制回原數組for (int i=0; i<tempArray.length; i++)array[i+start]=tempArray[i]; } public static void main(String[] args) {int[] array = { 5, 8, 6, 3, 9, 2, 1, 7 };mergeSort(array, 0, array.length-1);System.out.println(Arrays.toString(array)); }

—————END—————

關注下方二維碼,訂閱更多精彩內容

?朕已閱

總結

以上是生活随笔為你收集整理的漫画:什么是归并排序?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。