MergeSort(合并排序)
生活随笔
收集整理的這篇文章主要介紹了
MergeSort(合并排序)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
mergeSort的關(guān)鍵是 merge。但是一個(gè)數(shù)組怎么來(lái)merge?所以,它是分兩步走的,首先它要把所給的數(shù)組分割開來(lái),然后對(duì)分割開來(lái)的子數(shù)組進(jìn)行合并。之前我們講過(guò)快排也要分割數(shù)組,但是這里的分割數(shù)組相對(duì)簡(jiǎn)單。重點(diǎn)是如何將分割開來(lái)的數(shù)組合并起來(lái)
?先上圖,看圖比較容易理解:
MergeSort過(guò)程分析
經(jīng)過(guò)我們的演示可以發(fā)現(xiàn),我們的合并是沿著當(dāng)初分割的原路合并的,在合并的時(shí)候?qū)⒃氐拇笮№樞蚺藕?/span>。
- 假如兩個(gè)子數(shù)組為left[i] , right[j]
- 先使用兩個(gè)數(shù)組的第一個(gè)元素比較大小,例如left[0]和right[0]比較大小,如果left[0]<=right[0],則在組成新數(shù)組時(shí),left[0]為新數(shù)組的第一個(gè)元素;right[0]再和left[1]比較大小。如此進(jìn)行下去
- 如過(guò)left[] 的元素已經(jīng)全部假如新的數(shù)組,而right[]還沒有全部假如新數(shù)組,則之間將right[]的剩余元素按其本身的順序關(guān)系添加到新數(shù)組后面即可
- ?
? ? 4.重復(fù)合并操作,直至重新生成的數(shù)組和數(shù)組大小一樣,MergeSort結(jié)束。
代碼演示
#include <stdio.h> #include <iostream>using namespace std; void merge(int arr[], int left,int mid, int right){int size_l = mid-left+1;int size_r = right- mid;int subArrLeft[size_l],subArrRight[size_r];for(int index = 0;index < size_l;index++){subArrLeft[index] = arr[left + index];}for(int index = 0;index < size_r;index++){subArrRight[index] = arr[mid + 1 + index];}int i = 0, j = 0;int k = left;// 按順序合并兩個(gè)子數(shù)組while (i < size_l && j < size_r){if(subArrLeft[i]<=subArrRight[j]){arr[k] = subArrLeft[i];i++;}else{arr[k] = subArrRight[j];j++;}k++;}// 如果比較的連個(gè)子數(shù)組中一個(gè)已經(jīng)為空,另一個(gè)還有剩余元素,則直接追加到合并數(shù)組的后面while (i < size_l){arr[k] = subArrLeft[i];i++;k++;}while (j < size_r){arr[k] = subArrRight[j];j++;k++;} }void mergeSort(int arr[], int left, int right){if(left < right){int mid = left +(right -left)/2;mergeSort(arr,left,mid); // 對(duì)左半邊數(shù)組做合并排序mergeSort(arr,mid+1,right); // 對(duì)右半邊數(shù)組做合并排序merge(arr,left,mid,right); // 對(duì)分開的數(shù)組進(jìn)行合并操作} }void printArray(int arr[], int size) {int i;for (i = 0; i < size; i++) cout << arr[i] << " ";cout << endl; } int main() {int arr[] = {10, 7, 82, 9, 13, 5, 2, 34, 54, 3, 26, 6, 37, 6, 48, 11};int arrSize = sizeof(arr)/sizeof(arr[0]);cout << "perpare sort array is "<<endl;printArray(arr, arrSize);mergeSort(arr, 0, arrSize - 1);cout<<"MergeSorted array is "<<endl;printArray(arr, arrSize);return 0; }代碼關(guān)鍵就在merge()函數(shù).
運(yùn)行結(jié)果
?
總結(jié)
以上是生活随笔為你收集整理的MergeSort(合并排序)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 暗黑战神学习笔记
- 下一篇: 谷歌Adblock Plus 广告拦截插