1. 程式人生 > >歸併排序對整形陣列排序

歸併排序對整形陣列排序

歸併排序的時間複雜度為O(nlog(n)),優於選擇排序和氣泡排序。

有一個例子如下:

#include <stdio.h>
int arrtemp[100]={0};
void print(int arr[],int n){
	int i;
	for(i=0;i<n;i++)
		printf("%d ",arr[i]);
	printf("\n");
}

void mergesort(int arr[],int low,int mid,int high){
	int i=low,j=mid+1,k=low;
	while(i<=mid&&j<=high)
		if(arr[i]<=arr[j]) arrtemp[k++]=arr[i++];//arr[i]<=arr[j]不能寫為arr[i]<arr[j],否則不是穩定排序
		else arrtemp[k++]=arr[j++];
	while(i<=mid) arrtemp[k++]=arr[i++];//如果前半段沒有完全被複制到臨時陣列,則複製剩餘部分
	while(j<=high) arrtemp[k++]=arr[j++];//如果後半段沒有完全被複制到臨時陣列,則複製剩餘部分
	for(i=low;i<=high;i++)//此處不能把low和high換成0、6之類的具體數,因為遞迴呼叫的關係
		arr[i]=arrtemp[i];
}

void merge(int arr[],int low,int high){
	int mid;
	if(low<high){
		mid=(low+high)/2;
		merge(arr,low,mid);
		merge(arr,mid+1,high);
		mergesort(arr,low,mid,high);
	}
}

int main(){
	int arr[]={45,39,96,85,41,9,56};
	int low=0,high=6;
	printf("排序前:");
	print(arr,high+1);
	merge(arr,low,high);
	printf("排序後:");
	print(arr,high+1);
	return 0;
}

 鑑於C的模組化程式設計,最好是先寫主函式,在主函式裡只寫要實現的功能,並用函式名代替,然後細化各個函式的功能,

如此思路會更加清晰,也減少犯錯的機率。本例子已在vc++ 6.0測試通過。