手摇算法(三重翻转算法)和空间复杂度为o(1)的归并排序

http://blog.csdn.net/ltyqljhwcm/article/details/52155097?locationNum=6&fps=1这篇文章对手摇算法以及归并排序有很详细的讲解!!

手摇算法就是空间复杂度为O(1),仅仅是依靠交换操作来对字符串进行处理。


利用手摇算法实现归并排序,主要需要三个变量:

i指向右边待排序列将要插入的左边序列的位置;

index指向右边待排序列的初始位置;

j指向右边待排序列的末尾位置的后一个位置;

也就是将右边index-----j-1之间的序列插入到左边i的前面的位置;也就是将index-------j-1和i-------index-1这两个数据块交换位置;

class MergeSort {
public:
    int* mergeSort(int* A, int n) {
        // write code here
        mergeSort(A,0,n-1);
        return A;
    }
    void mergeSort(int* A,int start,int end){
        if(start>=end)
            return;
        int middle=(start+end)/2;
        mergeSort(A,start,middle);
        mergeSort(A,middle+1,end);
        merging(A,start,middle,end);
    }
    void merging(int* A,int start, int middle, int end){
        int i=start;
        int index=middle+1;
        int j=middle+1;
        while(j<=end&&i<j){
        while(A[i]<=A[j]&&i<j){
            i=i+1;
        }
        if(i>=j)
            break;//说明此时已经排序结束
        while(A[j]<A[i]&&j<=end){
            j=j+1;
        }
        reverse(A,index,j-1);
        reverse(A,i,index-1);
        reverse(A,i,j-1);
        i=i+(j-index);
        index=j;
        }  
    }
    void reverse(int* A,int left,int right){
        if(left==right)
            return;
        while(left<=right){
            int temp;
            int* p;
            int* q;
            p=&A[left];
            q=&A[right];
            temp=*p;
            *p=*q;
            *q=temp;
            left=left+1;
            right=right-1;  
        }
    }
};

对于上面的归并排序来说,空间复杂度为o(1),而时间复杂度为O(n*logn)--O(n*n*logn)。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值