歸併排序

    歸併排序是幾種排序算法中較快的一種,速度快,穩定性高,因爲經常使用,下邊就詳細講解一下  

    歸併排序才用了分治的思想,將數進行的分組,分割到最小組,然後進行合併,合併時排序(個人理解),直到完成排序。但是歸併排序需要佔用額外的空間。

  • 代碼如下:
  • C++實現:
#include<cstdio>
#include<cstring>
#define MAXN 7000
using namespace std;
 
Merge_Array(int* arr,int l,int m,int r,int* p)  //將數組進行合併
{
	int i=l,j=m+1;   //數組中,l-m爲左半邊的數,而m+1 ->r爲右半邊的數,合併到臨時數組p種
	int pc=0;
	while(i<=m && j<=r)
	{
		if(arr[i]<=arr[j]) p[pc++]=arr[i++];
		if(arr[i]>arr[j]) p[pc++]=arr[j++];
	}
 
	while(i<=m) p[pc++]=arr[i++];
	while(j<=r) p[pc++]=arr[j++];
 
	for(i=0;i<pc;i++)  
		arr[i+l]=p[i];  //每次合併後,前l項已經排完
}
 
merge_sort(int* arr,int l,int r,int* p) //進行分治,直到最小組爲止
{											
	if(l<r)
	{		//這個過程主要採用遞歸,遞歸利用了棧,考慮到棧的LIFO特性,就不難以理解
		int m=(l+r)/2;	
		merge_sort(arr,l,m,p);  //進行左邊分治
		merge_sort(arr,m+1,r,p);  //進行右邊分治
		Merge_Array(arr,l,m,r,p);  //歸併 && 排序
	}
}
 
void Merge_sort(int* arr,int n)  //這裏是新開闢了臨時的數組,也可以使用全局變量,這個可有可無
{
	int *p=new int[n];
	merge_sort(arr,0,n-1,p);
	delete p;
}
 
int main()
{
	int n;
	while(~scanf("%d",&n))
	{
		int arr[MAXN];
		for(int i=0;i<n;i++)
			scanf("%d",&arr[i]);
		Merge_sort(arr,n);
		for(int i=0;i<n;i++)
			printf("%3d",arr[i]);
		printf("\n");
	}
}
  • Java代碼(沒有註釋)
import java.util.Scanner;
 
public class merge_sort {
	
	static int[] p=new int[4000];
	
	public static void Merge_Array(int[] arr,int l,int m,int r,int[] p){
		int i=l,b=m+1;
		int pc=0;
		while(i<=m && b<=r){
			if(arr[i]<=arr[b]) p[pc++]=arr[i++];
			if(arr[i]>arr[b]) p[pc++]=arr[b++];
		}
		
		while(i<=m) p[pc++]=arr[i++];
		while(b<=r) p[pc++]=arr[b++];
		
		for(i=0;i<pc;i++){
			arr[l+i]=p[i];
		}
	}
	
	public static void merge_sort(int[] arr,int l,int r,int[] p){
		if(l<r){
			int m=(l+r)/2;
			merge_sort(arr,l,m,p);
			merge_sort(arr,m+1,r,p);
			Merge_Array(arr,l,m,r,p);
		}
	}
	
	public static void Merge_sort(int[] arr,int n){
		for(int i=0;i<=n;i++)
			p[i]=0;
		merge_sort(arr,0,n-1,p);
	}
 
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] arr=new int[4000];
		Scanner temp=new Scanner(System.in);
		int n=temp.nextInt();
		for(int i=0;i<n;i++)
			arr[i]=temp.nextInt();
		Merge_sort(arr,n);
		
		for(int i=0;i<n;i++)
			System.out.print(arr[i]+" ");
		System.out.println();
	}
}
發佈了50 篇原創文章 · 獲贊 2 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章