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


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

    主要是研究快排和堆排序

      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/
  • 相关阅读:
    vs2013 在win7下,使用c++创建项目各种报错问题解决方案
    排序含有数字的字符串:一个巧妙地方法
    wpf 控件大小随窗体大小改变而改变
    WPF TreeView 选择事件执行两次,获取TreeView的父节点的解决方法
    最近几年的编程感悟(3)完结
    mysql Packet for query is too large (2036 > 1024). You can change this value on the server by setting the max_allowed_packet' variable.
    java BigDecimal加减乘除 与 保留两位小数
    java 字符串的运算公式直接转计算结果
    ecplise tomcat忽然出现404
    float 、double 加减乘除出现小数位多出的问题
  • 原文地址:https://www.cnblogs.com/menglei/p/2820168.html
Copyright © 2020-2023  润新知