【数据结构练习】排序——堆排序和快排

上机考试考完了,但是笔试还没有考,所以把以前的代码翻了出来研究研究

主要是研究快排和堆排序

  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/
原文地址:https://www.cnblogs.com/menglei/p/2820168.html