美文网首页
数据结构java,c,python实现二路归并排序

数据结构java,c,python实现二路归并排序

作者: 甜柚小仙女 | 来源:发表于2019-01-27 12:16 被阅读0次

    c语言

    #include<stdio.h>
    #include<stdlib.h>
    void Merge(int *num1,int start,int mid,int end){
        int *res;
        res = (int *)malloc(sizeof(int)*(start+end+1));
        int lp = start;
        int rp = mid+1;
        int Nindex = start;     
        while(lp<=mid&&rp<=end){
            if(num1[lp]<num1[rp]){
                res[Nindex++] = num1[lp++];
            }
            else{
                res[Nindex++] = num1[rp++];
            }       
        }
        while(lp<=mid){
                res[Nindex++] = num1[lp++];
            }
        
        while(rp<=end){
                res[Nindex++] = num1[rp++];
            }
        
        while(start<=end){
            num1[start] = res[start++]; 
        }
    }
    void MergeSort(int *num,int start,int end){     
            if(start>=end)
                return;     
            int middle = (start+end)/2; 
            MergeSort(num,start,middle);
            MergeSort(num,middle+1,end);
            Merge(num,start,middle,end);
    
    }
    int main(){
        int num[]={1,23,-1,15,4,6,8,10};
        int i;
        int len = sizeof(num)/sizeof(int);
        MergeSort(num,0,len-1);
        for(i=0;i<len;i++)
            printf("%d ",num[i]);
    }
    

    java

    package smile;
    
    import java.util.Arrays;
    
    public class MergeSort {
        public static void main(String[] args) {
            int num[] = {1,18,25,-1,8,56,13,6,7,34};
            mergeSort(num,0,num.length-1);
            System.out.println(Arrays.toString(num));
        }
    //递归调用归并排序
        public static void mergeSort(int []num,int start,int end) {
            if(start>=end) {
                return;
            }       
            int middle = (end+start)/2;
            mergeSort(num,start,middle);
            mergeSort(num,middle+1,end);
            merge(num,start,end,middle);
            
        }
    //合并两个有序数组
        public static void merge(int []num,int start,int end,int middle) {
            int res[] = new int[num.length];
            int i=start;  //左边数组的开始i
            int j=middle+1; //右边数组的开始j
            int k=start;  //新数组的插入索引
            while((i<=middle)&&(j<=end)) {
                if(num[i]<num[j]) {
                    res[k++]=num[i++];  //若左边数组中的值小于右边的,则将左边数组中该元素加入到新数组中,并将i后移
                }
                else {
                    res[k++]=num[j++];   //若左边数组中的值大于或等于右边的,则将右边数组中该元素加入到新数组中,并将j后移
                }
            }   
    //      当两个数组长度不一致导致有一个先结束循环,则将另一个数组剩下的数全部加入到新数组中
            while(j<=end) {
                res[k++] = num[j++];
            }
            while(i<=middle) {
                res[k++] = num[i++];
            }   
    //      将排好序的元素放回到原数组中
            while(start<=end) {
                num[start] = res[start++];
            }
        }
    }
    

    python

    # 合并函数将两个有序的数组合并成一个有序数组
    def merge(a,b):
        ap=0
        bp=0
        res=[]
    # 用两个指针分别指向两个列表元素,若指向的元素满足条件,则加入新数组且指针后移,再继续比较
        while ap<len(a) and bp<len(b):
            if a[ap]<b[bp]:
                res.append(a[ap])
                ap+=1
            else:
                res.append(b[bp])
                bp+=1
    
    # 若是有其中一个数组提前结束循环,将它剩下的元素直接放入合并后的列表
        if len(a)==ap:
            for i in b[bp:]:
                res.append(i)
        else:
            for i in a[ap:]:
                res.append(i)
        return res
    
    # 递归调用归并算法,当元素少于两个时,返回该元素的值
    def mergeSort(num):
        if len(num)<=1:
            return num
        middle = len(num)//2
        l=mergeSort(num[:middle])
        r=mergeSort(num[middle:])
        return merge(l,r)
    
    if __name__ == '__main__':
        num = [1,8,4,3,7,5,6]
        re = mergeSort(num)
        print(re)
    

    由此可见 python写算法是真的爽!!!

    相关文章

      网友评论

          本文标题:数据结构java,c,python实现二路归并排序

          本文链接:https://www.haomeiwen.com/subject/bvpgjqtx.html