分治法排序之歸並排序


使用分治法的兩路合並排序算法:

將待排序的元素序列一分為二,得到長度基本相等的兩個子序列,分別排序。

如果子序列較長,還可繼續細分,直到子序列的長度不超過1為止。

當分解所得的子序列已排列有序時,將兩個有序子序列合並成一個有序子序列,得到原問題的解。

合並方法:

比較兩序列中的最小值,輸出其中較小者,然后重復此過程,直到其中一個隊列為空時,

如果另一個隊列還有元素沒有輸出,則將剩余元素依次輸出。

#include<stdio.h>
#define N 100
int merge(int *a, int left,int mid,int right)
{
  int i,j,k=0;
  int b[N]={0};
  i=left;
  j=mid+1;
  while(i<=mid&&j<=right) /*把兩個序列中小的部分先輸入到中間數組*/
  {
    if(a[i]<a[j])
      b[k++]=a[i++];
    else
      b[k++]=a[j++];
  }
  while(i<=mid) /*沒有輸完的序列剩下的依次輸入到中間數組*/
    b[k++]=a[i++];
  while(j<=right)
    b[k++]=a[j++];
  for(i=0;i<k;i++) /*將排序好的出處在中間數組里的序列輸入到a數組*/
    a[left++]=b[i];
  return 0;
}
int mergesort(int *a,int left,int right) /*將序列划分為等大的兩部分再調用排序*/
{
  int i,j,mid;
  if(right-left>=1)
  {
    mid=(left+right)/2;
    mergesort(a,left,mid);
    mergesort(a,mid+1,right);
    merge(a,left,mid,right); /*調用排序*/
  }
  return 0;
}
int main()
{
  int a[N]={0},i,n;
  printf("please input the length of the list:\n");
  scanf("%d",&n);
  printf("please input the number of the list:\n");
  for(i=0;i<n;i++)
    scanf("%d",&a[i]);
  mergesort(a,0,n-1);
  printf("the sort of the list is :\n");
  for(i=0;i<n;i++)
    printf("%d ",a[i]);
  printf("\n");
  return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM