Java源代碼
public class Mergesort1 { public static void merge(int[]a,int low,int mid,int high){//對兩組已經排序的數組進行合並 int[]b=new int[high-low+1]; //臨時數組,存儲個數為high - low + 1個數據 int s=low; int t=mid+1; int k=0; while(s<=mid&&t<=high){ //直至前半部或后半部數據完全錄入暫存 if(a[s]<=a[t]) //如果前半部的數據小於后半部的,前半部數據暫存 b[k++]=a[s++]; else //否則后半部數據暫存,並下標自加 b[k++]=a[t++]; } while(s<=mid) b[k++]=a[s++]; while(t<=high) b[k++]=a[t++]; for(int i=0;i<b.length;i++){ //將暫存的數據重新填充至array[low]--array[high]中 a[low+i]=b[i]; } } public static void mergesort(int a[],int low,int high){//對數組進行遞歸排序 int mid; if(low<high){ mid=(low+high)/2; mergesort(a,low,mid); mergesort(a,mid+1,high); merge(a,low,mid,high); } } public static void main(String[]args){ int[]a={4,34,2,56,5,9,6,45,8,3}; System.out.println("排序前數組為:"); for(int i=0;i<a.length;i++){ System.out.print(a[i]+" "); } mergesort(a,0,a.length-1); System.out.println("\n排序后數組為:"); for(int i=0;i<a.length;i++){ System.out.print(a[i]+" ");} } }
運行結果:
排序前數組為:
4 34 2 56 5 9 6 45 8 3
排序后數組為:
2 3 4 5 6 8 9 34 45 56
C++源代碼:
#include <iostream> using namespace std; void Merge(int *array, int low, int middle, int high) //合並 { int *A = new int[high - low + 1]; //臨時數組,存儲個數為high - low + 1個數據 int i = low; int j = middle + 1; int k = 0; while(i <= middle && j <= high) //直至前半部或后半部數據完全錄入暫存 { if(array[i] < array[j]) //如果前半部的數據小於后半部的,前半部數據暫存 A[k++] = array[i++]; else //否則后半部數據暫存,並下標自加 A[k++] = array[j++]; } while(i <= middle) //保證前半部數據錄入暫存 A[k++] = array[i++]; while(j <= high) //保證后半部數據錄入暫存 A[k++] = array[j++]; for(i = low; i <= high; i++) //將暫存的數據重新填充至array[low]--array[high]中 array[i] = A[i - low]; } void MergeSort(int *array, int low, int high) { int middle; //二分 if(low < high) { middle = (low + high) / 2; //二分 MergeSort(array, low, middle); //前半部 MergeSort(array, middle + 1, high); //后半部 Merge(array, low, middle, high); //合並 } } int main() { cout<<"輸入需要排列數據的個數:"; int n; cin>>n; //錄入需要排列的個數 int *array = new int[n]; cout<<endl<<"請輸入數據:"<<endl; for(int i = 0; i < n; i++) { cin>>array[i]; //錄入未排序的數據 } MergeSort(array, 0, n - 1); //進行排序 cout<<"排列后數據:"<<endl; for(int j = 0; j < n; j++) //輸出排列結果 { cout<<array[j]<<" "; } cout<<endl; return 0; }
運行結果: