歸併排序對整形陣列排序
阿新 • • 發佈:2019-01-04
歸併排序的時間複雜度為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測試通過。