上机考试考完了,但是笔试还没有考,所以把以前的代码翻了出来研究研究
主要是研究快排和堆排序
1 //============================================================================ 2 // Name : leap.cpp 3 // Author : 4 // Version : 5 // Copyright : Your copyright notice 6 // Description : Hello World in C++, Ansi-style 7 //============================================================================ 8 9 #include <iostream> 10 using namespace std; 11 12 template<class T> //qsort 快排,返回递增序列 13 void quicksort(T *p,int s,int e) //array low high 14 { 15 if(s<e) 16 { 17 int i=s,j=e; 18 T tmp=p[e];//选取最后一个记录做为轴记录 19 while(i<j) 20 { 21 while(p[i]<tmp&&i<j) ++i; 22 if(i<j) p[j--]=p[i]; 23 while(tmp<p[j]&&i<j) --j; 24 if(i<j) p[i++]=p[j]; 25 } 26 p[i]=tmp; 27 //加入一个查看当前排序状态 28 for(int no = 0;no< 10;no++){ 29 cout<<p[no]<<" "; 30 } 31 cout<<endl; 32 quicksort(p,s,i-1); 33 quicksort(p,i+1,e); 34 } 35 } 36 37 38 struct _heap{ //堆排序 弹出最小的 39 int a[32768],n; 40 _heap(){n=0;} 41 int pre(int p){return (p-1)>>1;}; // >> stand for / 42 int left(int p){return (p<<1)+1;}; // << stand for * 43 int right(int p){return (p<<1)+2;}; 44 void ins(int x){ // 创建 45 int p; 46 n++; 47 for(p=n-1;p>0;){ 48 if(x<a[pre(p)]) 49 a[p]=a[pre(p)],p=pre(p); 50 else break; 51 } 52 a[p]=x; 53 } 54 int pop(){ 55 int p,x=a[0],tmp; 56 for(p=0,n--;left(p)<n;){ 57 tmp=(right(p)<n&&a[right(p)]<a[left(p)])?right(p):left(p); 58 if(a[tmp]<a[n])a[p]=a[tmp],p=tmp; 59 else break; 60 } 61 a[p]=a[n]; 62 return x; 63 } 64 }; 65 struct heap //堆排序 弹出最大的 66 { 67 int ele[22222]; 68 int n; 69 heap(){n=0;} 70 int pre(int k) {;return (k-1)>>1;} 71 int lson(int k){return (k<<1)+1;} 72 int rson(int k){return (k<<1)+2;} 73 void ins(int x) 74 { 75 int p=n++; 76 for(;p>0;) 77 { 78 if(ele[pre(p)]<x) 79 { 80 ele[p]=ele[pre(p)]; 81 p=pre(p); 82 } 83 else break; 84 } 85 ele[p]=x; 86 } 87 int pop() 88 { 89 int tmp,p=0,x=ele[0]; 90 for(n--;lson(p)<n;) 91 { 92 tmp=(rson(p)<n&&ele[rson(p)]>ele[lson(p)])?rson(p):lson(p); 93 if(ele[tmp]>ele[n]) 94 { 95 ele[p]=ele[tmp]; 96 p=tmp; 97 } 98 else break; 99 } 100 ele[p]=ele[n]; 101 return x; 102 } 103 }G; 104 105 106 107 108 int main() { 109 110 srand((int)time(0)); 111 for(int i = 0;i<10;i++){ //堆排序示例 112 G.ins(rand()); 113 } 114 int n = 10; 115 cout<<"堆排,排序好的:"<<endl; 116 while(n--){ 117 printf("%d ",G.pop()); 118 } 119 puts("\n------------------"); 120 //快排 121 int a [10]; 122 for(int i = 0;i<10;i++){ 123 a[i] = rand(); 124 } 125 quicksort(a,0,10); 126 n = 10; 127 cout<<"快排,排序好的 :"<<endl; 128 while(n--){ //倒着输出 129 printf("%d ", a[9-n] ); 130 } 131 return 0; 132 }
运行结果:
在这我选中的地方我发现这部分的序列并没有改变,只不过这次提前了一行。大家帮忙分析一下。尝试着自己试试
我猜测是在递归调用的时候,他是随机的递归,无法输出目前的序列
例如:
转载文章请注明出处: http://www.cnblogs.com/menglei/