非递归快速排序和非递归快速乘幂

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <stack>
 4 using namespace std;
 5 long long  re_pows(int a,int n)//递归快速乘幂
 6 {
 7     if(n==0) return 1;
 8     long long t=re_pows(a,n/2);
 9     long long ans=t*t;
10     if(n&1) ans*=a;
11     return ans;
12 }
13 long long  ure_pows(int a,int n)//非递归快速乘幂
14 {
15     int i=1;
16     while(i<=n)i<<=1;
17     long long ans=1;
18     while(i>>=1)
19     {
20         ans*=ans;
21         if(n&i) ans*=a;
22     }
23     return ans;
24 }
25 int arr[100]={1,2,4,5,3};
26 struct node
27 {
28     int l,r;
29     node(){}
30     node(int a,int b){l=a;r=b;}
31 };
32 int part(int l,int r)
33 {
34     int i=l-1,j=l;
35     while(j<r)
36     {
37         if(arr[j]<arr[r])
38             swap(arr[++i],arr[j++]);
39         else j++;
40     }
41     swap(arr[++i],arr[r]);
42     return i;
43 }
44 
45 void re_qsort(int l,int r)//递归快速排序
46 {
47     if(l>=r) return;
48     int m=part(l,r);
49     re_qsort(l,m-1);
50     re_qsort(m+1,r);
51 }
52 
53 stack<node> q;
54 void ure_qsort(int l,int r)//非递归快速排序
55 {
56     q.push(node(l,r));
57     while(!q.empty())
58     {
59         l=q.top().l;
60         r=q.top().r;
61         q.pop();
62         while(l<r)
63         {
64             int m=part(l,r);
65             q.push(node(m+1,r));//把右边的保存下来
66             r=m-1;
67         }
68     }
69 }
70 int main()
71 {
72     int i,n;
73     while(cin>>n)
74     {
75         for(i=0;i<n;i++)
76         {
77             cin>>arr[i];
78         }
79         ure_qsort(0,n-1);
80         for(i=0;i<n;i++)
81         {
82             cout<<arr[i]<<' ';
83         }
84         cout<<endl;
85     }
86     return 0;
87 }
posted @ 2012-12-01 21:01  qijinbiao1  阅读(340)  评论(0编辑  收藏  举报