空间复杂度为O(1)的归并排序

View Code
 1 #include <iostream>
 2 #include <cassert>
 3 #include <cmath>
 4 using namespace std;
 5 
 6 //数组反转
 7 void reverse(int *a,int aLength)
 8 {
 9     assert(a);
10     int i=0;
11     int j=aLength-1;
12     while(i<j && i<aLength && j>0)
13     {
14         swap(a[i],a[j]);
15         i++;
16         j--;
17     }
18 }
19 
20 //三次反转实现数组旋转
21 //数组a长度为aLength,将a[0...pos-1]和
22 //a[pos...aLength-1]作位置交换
23 void exchange(int *a,int aLength,int pos)
24 {
25     assert(a);
26     reverse(a,pos);
27     reverse(a+pos,aLength-pos);
28     reverse(a,aLength);
29 }
30 
31 //通过旋转实现merge
32 void Merge(int *a,int aLength,int pos)
33 {
34     assert(a && aLength>0 && pos<=aLength);
35     int i=0;
36     int j=pos;
37     while (j<aLength && i<j)
38     {
39         while (i<j && a[i]<=a[j])
40         {
41                 i++;
42         }
43         int maxMove=0;
44         while (j<aLength && a[i]>a[j])
45         {
46             maxMove++;
47             j++;
48         }
49         exchange(a+i,j-i,j-i-maxMove);
50         i+=maxMove;
51     }
52 }
53 
54 void print(int *a,int aLength)
55 {
56     for (int i=0;i<aLength;i++)
57     {
58         cout<<a[i]<<"  ";
59     }
60     cout<<endl;
61 }
62 int main()
63 {
64     const int aLength=8;
65     int a[aLength]={1,6,8,19,2,3,23,35};
66     Merge(a,aLength,4);
67     print(a,aLength);
68 }

参考文章:http://www.cppblog.com/converse/archive/2008/09/28/63008.html

转载于:https://www.cnblogs.com/ZJUKasuosuo/archive/2012/07/14/2591605.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值