二路归并排序

发布时间 2024-01-02 18:26:39作者: 帅帅的编程之路

算法思想

将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。即一种分目标完成程序算法,简单问题可用二分法完成。

思想:将待排序序列划分成若干个有序子序列;将两个或两个以上的有序子序列合并为一个有序序列。

 

算法图解

分而治之

 

 代码实现

void Sort(int arr[],int left,int right);
int main(){
    int arr[N]={8,4,5,7,1,3,6,2};
    Sort(arr,0,N-1);
    printf("数组升序排列:");
    for (int i = 0; i < N; ++i) {
        printf("%d ",arr[i]);
    }
    printf("\n");
    return 0;
}
void Sort(int arr[],int left,int right){
    if(right==left){
        return;
    }
    int mid=(right+left)/2;
    Sort(arr,left,mid);
    Sort(arr,mid+1,right);

    int temp[N];
    int i=left;
    int j=mid+1;
    int k=left;
    while(i<=mid||j<=right){
        if(j>right||(i<=mid && arr[i]<arr[j])){
            temp[k]=arr[i];
            k=k+1;i=i+1;
        }else{
            temp[k]=arr[j];
            k=k+1;
            j=j+1;
        }
    }
    for (k = left; k <=right ; k++) {
        arr[k]=temp[k];
    }
}

 

 运行结果