手摇算法(三重翻转算法)和空间复杂度为o(1)的归并排序
2017-06-21 11:52
197 查看
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)。
手摇算法就是空间复杂度为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)。
相关文章推荐
- 原地归并算法(空间复杂度为O(1)的归并排序)
- 算法的时间复杂度和空间复杂度
- 算法的时间复杂度和空间复杂度-总结
- 第一章作业2-算法时间复杂度和空间复杂度
- 算法的空间复杂度
- 算法的时间复杂度和空间复杂度-总结
- 算法的时间复杂度和空间复杂度
- 算法的时间复杂度和空间复杂度-总结
- 算法的时间复杂度和空间复杂度-总结
- 算法的时间复杂度和空间复杂度
- 有关算法时间复杂度和空间复杂度的浅析
- 算法的时间复杂度和空间复杂度
- 算法的时间复杂度和空间复杂度-总结
- 请实现一个算法,在不使用额外数据结构和储存空间的情况下,翻转一个给定的字符串(可以使用单个过程变量)。 给定一个string iniString,请返回一个string,为翻转后的字符串。保证字符串的
- 各个算法的时间复杂度和空间复杂度分析
- 归并排序 空间复杂度为O(1)的做法
- 算法的时间复杂度和空间复杂度-总结
- 算法——时间复杂度和空间复杂度
- 算法的时间复杂度和空间复杂度
- 算法的时间复杂度和空间复杂度-总结