zoukankan      html  css  js  c++  java
  • 数据结构实验报告(六)

    实验6 排序

      1 #include <iostream>
      2 #include <stdio.h>
      3 #include <stdlib.h>
      4 #define INFINITY INT_MAX
      5 #define MAXSIZE 100
      6 
      7 using namespace std;
      8 typedef struct list
      9 {int key;
     10 }ElemType;
     11 typedef struct {
     12 ElemType data[MAXSIZE+1];
     13 int length; /*参加排序元素的实际个数*/
     14 }SeqList;
     15 //创建顺序表
     16 void creatList(SeqList &l)
     17 {
     18     cout<<"请输入数据个数"<<endl;
     19     cin>>l.length;
     20     cout<<"请顺次输入一组无序数据"<<endl;
     21     for (int i=1;i<=l.length;i++)
     22     {
     23         cin>>l.data[i].key;
     24     }
     25 }
     26 // 直接插入排序
     27 void InsertSort(SeqList &l)
     28 {
     29     int i,j;
     30     for (i=2;i<=l.length;i++)
     31     {
     32         if (l.data[i].key < l.data[i-1].key )
     33         {
     34             l.data[0].key=l.data[i].key;
     35             l.data[i].key=l.data[i-1].key;
     36             for (j=i-2;l.data[0].key < l.data[j].key ;j--)
     37                 l.data[j+1].key=l.data[j].key;
     38             l.data[j+1].key=l.data[0].key;
     39         }
     40     }
     41 }
     42 //输出顺序表元素
     43 void print(SeqList l)
     44 {
     45     int i;
     46     for (i=1;i<=l.length;i++)
     47         cout<<l.data[i].key<<" ";
     48     cout<<endl;
     49 }
     50 //冒泡排序
     51 void BubbleSort(SeqList &l)
     52 {
     53     int i,j;
     54     for (i=1;i<=l.length-1;i++)
     55         for (j=1;j<=l.length-i;j++)
     56     {
     57         if (l.data[j].key > l.data[j+1].key)
     58         {
     59            l.data[0]=l.data[j];
     60            l.data[j]=l.data[j+1];
     61            l.data[j+1]=l.data[0];
     62         }
     63     }
     64 }
     65 // 直接选择排序
     66 void SelectSort(SeqList &l)
     67 {
     68     int i,j,k;
     69     for (i=1;i<=l.length-1;i++)
     70     {
     71         k=i;
     72         for (j=i;j<=l.length;j++)
     73         {
     74           if (l.data[j].key<l.data[k].key)
     75           {
     76               k=j;
     77           }
     78         }
     79         if (k!=i)
     80         {
     81             l.data[0]=l.data[k];
     82             l.data[k]=l.data[i];
     83             l.data[i]=l.data[0];
     84         }
     85     }
     86 }
     87 //希尔插入
     88 void ShellInsert(SeqList &l,int dk)
     89 {
     90     //dk是位置增量
     91     int i,j;
     92     for (i=dk+1;i<=l.length;i++)
     93     {
     94         if (l.data[i].key < l.data[i-dk].key)
     95         {
     96             l.data[0]=l.data[i];
     97             for (j=i-dk;j>0&&l.data[0].key<l.data[j].key;j=j-dk)
     98             {
     99                 l.data[j+dk]=l.data[j];
    100             }
    101             l.data[j+dk]=l.data[0];
    102         }
    103     }
    104 }
    105 //希尔排序
    106 void ShellSort(SeqList &l,int dlta[],int t)
    107 {
    108     //dlta[]是增量数组,每一次循环以dlta[k]为增量,dlta[0---t-1]
    109     int k;
    110     for (k=0;k<t;k++)
    111         ShellInsert(l,dlta[k]);
    112 }
    113 //快排
    114 int Partition(SeqList &l,int low,int high)
    115 {
    116     l.data[0]=l.data[low];
    117     int p;
    118     p=l.data[low].key;
    119     while (low<high)
    120     {
    121         while (low<high&&l.data[high].key>=p) high--;
    122         l.data[low]=l.data[high];
    123         while (low<high&&l.data[low].key<=p) low++;
    124         l.data[high]=l.data[low];
    125     }
    126     l.data[low]=l.data[0];
    127     return low;
    128 }
    129 void QSort(SeqList &l,int low,int high)
    130 {
    131     int p;
    132     if (low<high)
    133     {
    134        p=Partition(l,low,high);
    135        QSort(l,low,p-1);
    136        QSort(l,p+1,high);
    137     }
    138 }
    139 
    140 //堆调整
    141 void HeapAdjust(SeqList &l,int s,int m)
    142 {
    143     ElemType rc=l.data[s];
    144     int j;
    145     for (j=2*s;j<=m;j*=2)
    146     {
    147         if (j<m && l.data[j].key < l.data[j+1].key)
    148             j++;
    149         if (!(rc.key < l.data[j].key))
    150             break;
    151         l.data[s]=l.data[j];s=j;
    152     }
    153     l.data[s]=rc;
    154 }
    155 //堆排序
    156 void HeapSort(SeqList &l)
    157 {
    158     int i;
    159     for (i=l.length/2;i>0;i--)
    160         HeapAdjust(l,i,l.length);
    161     for (i=l.length;i>1;i--)
    162     {
    163         l.data[0]=l.data[1];
    164         l.data[1]=l.data[i];//data[1]即为最大的数
    165         l.data[i]=l.data[0];
    166         HeapAdjust(l,1,i-1);
    167     }
    168 
    169 
    170 }
    171 
    172 //折半插入排序
    173 void BinInsertSort(SeqList &l)
    174 {
    175     int i,j,low,high,mid;
    176     for (i=2;i<=l.length;i++)
    177     {
    178         l.data[0]=l.data[i];
    179         low=1;high=i-1;
    180         while (low<=high)
    181         {
    182             mid=(low+high)/2;
    183             if (l.data[0].key < l.data[mid].key ) high=mid-1;
    184             else low=mid+1;
    185         }
    186         for (j=i-1;j>=high+1;j--)
    187             l.data[j+1]=l.data[j];
    188         l.data[high+1]=l.data[0];
    189     }
    190 }
    191 // 链式存储实现简单选择排序
    192 typedef struct LNode
    193 {
    194     ElemType data;
    195     struct LNode *next;
    196 }LNode,*linklist;
    197 //创建单链表l
    198 void createLinkList(linklist &l)
    199 {
    200     linklist p,q;
    201     l=(linklist)malloc(sizeof(LNode));
    202     p=l;
    203     cout<<"请输入数据个数"<<endl;
    204     int n;cin>>n;
    205     cout<<"请输入一组数据"<<endl;
    206     ElemType e;
    207 
    208     for (int i=0;i<n;i++)
    209     {
    210         cin>>e.key;
    211         q=(linklist)malloc(sizeof(LNode));
    212         q->data.key=e.key;
    213         q->next=NULL;
    214         p->next=q;
    215         p=q;
    216     }
    217 
    218 }
    219 // 简单选择排序
    220 void SelectSort_linklist(linklist &l)
    221 {
    222     ElemType tmp;
    223     linklist p,q,k;//P为工作指针,Q为指向最小元素的指针,k为前面指向第一个为排序元素的指针
    224     p=l->next;q=p;k=p;
    225     while (k)
    226     {
    227 
    228     while (p)
    229     {
    230         if (p->data.key < q->data.key )
    231         {
    232             q=p;
    233         }
    234         p=p->next;
    235     }
    236     if (k!=q)
    237     {
    238         tmp=k->data;
    239         k->data=q->data;
    240         q->data=tmp;
    241     }
    242     k=k->next;
    243     p=k;
    244     q=k;
    245     }
    246 }
    247 //打印链表
    248 void print_linklist(linklist l)
    249 {
    250     linklist p=l->next;
    251     while (p)
    252     {
    253         cout<<p->data.key<<" ";
    254         p=p->next;
    255     }
    256     cout<<endl;
    257 }
    258 // 链式直接插入排序
    259 void InsertSort_linklist(linklist &l)
    260 {
    261     linklist p,q,t;
    262     p=l->next->next;//把P插入到链表L中
    263     l->next->next=NULL;
    264     q=l;
    265     while (p)
    266     {
    267         while (q->next && p->data.key >q->next->data.key)
    268             q=q->next;
    269         if (!q)
    270         {
    271             q->next = p;
    272             p=p->next;
    273             p->next=NULL;
    274         }
    275         else
    276         {
    277             t=p;p=p->next;
    278             t->next=q->next;
    279             q->next=t;
    280         }
    281         q=l;
    282     }
    283 }
    284 // 链式冒泡排序
    285 void BubbleSort_linklist(linklist &l)
    286 {
    287     linklist p=l->next,q,c;
    288     q=p->next;
    289     ElemType e;
    290     c=p;
    291     while (c)
    292     {
    293        while (q)
    294     {
    295 
    296         if (p->data.key > q->data.key )
    297         {
    298             e=p->data;
    299             p->data=q->data;
    300             q->data=e;
    301         }
    302         p=p->next;q=q->next;
    303     }
    304     p=l->next,q=p->next;
    305     c=c->next;
    306     }
    307 
    308 
    309 }
    310 int main()
    311 {   cout<<"--------------------------------------------------------"<<endl;
    312     cout<<"1.InsertSort():直接插入排序"<<endl;
    313     cout<<"2.Bl.data[1]ubbleSort():冒泡排序"<<endl;
    314     cout<<"3.SelectSort():直接选择排序"<<endl;
    315     cout<<"4.ShellSort():希尔排序"<<endl;
    316     cout<<"5.QSort():快速排序"<<endl;
    317     cout<<"6.HeapSort():堆排序"<<endl;
    318     cout<<"7.BinInsertSort():折半插入排序"<<endl;
    319     cout<<"9.SelectSort_linklist():链式简单选择排序"<<endl;
    320     cout<<"10.InsertSort_linklist():链式直接插入排序"<<endl;
    321     cout<<"11.BubbleSort_linklist():链式冒泡排序"<<endl;
    322     cout<<"--------------------------------------------------------"<<endl;
    323 ll1:cout<<"请输入您选择的函数序号"<<endl;
    324     int x;cin>>x;
    325     SeqList l;
    326     linklist l1;
    327     switch(x)
    328     {
    329     case 1:
    330     {
    331     creatList(l);
    332     cout<<"直接插入排序前的结果"<<endl;
    333     print(l);
    334     InsertSort(l);
    335     cout<<"直接插入排序后的结果"<<endl;
    336     print(l);
    337     break;
    338     }
    339 
    340     case 2:
    341     {
    342     creatList(l);
    343     cout<<"冒泡排序前的结果"<<endl;
    344     print(l);
    345     BubbleSort(l);
    346     cout<<"冒泡排序后的结果"<<endl;
    347     print(l);
    348        break;
    349     }
    350 
    351     case 3:
    352         {
    353     creatList(l);
    354     cout<<"直接选择排序前的结果"<<endl;
    355     print(l);
    356     SelectSort(l);
    357     cout<<"直接选择排序后的结果"<<endl;
    358     print(l);
    359             break;
    360         }
    361     case 4:
    362     creatList(l);
    363     cout<<"希尔排序前的结果"<<endl;
    364     print(l);
    365     int dlta[3];dlta[0]=5;dlta[1]=3;dlta[2]=1;
    366     ShellSort(l,dlta,3);
    367     cout<<"希尔排序后的结果"<<endl;
    368     print(l);
    369         break;
    370 
    371     case 5:
    372     creatList(l);
    373     cout<<"快速排序前的结果"<<endl;
    374     print(l);
    375     QSort(l,1,8);
    376     cout<<"快速排序后的结果"<<endl;
    377     print(l);
    378         break;
    379 
    380     case 6:
    381         {
    382     creatList(l);
    383     cout<<"堆排序前的结果"<<endl;
    384     print(l);
    385     HeapSort(l);
    386     cout<<"堆排序后的结果"<<endl;
    387     print(l);
    388       break;
    389         }
    390 
    391     case 7:
    392         {
    393     creatList(l);
    394     cout<<"折半插入排序前的结果"<<endl;
    395     print(l);
    396     BinInsertSort(l);
    397     cout<<"折半插入排序后的结果"<<endl;
    398     print(l);
    399       break;
    400         }
    401     case 9:
    402         {
    403             createLinkList(l1);
    404             cout<<"链式简单选择排序之前:"<<endl;
    405             print_linklist(l1);
    406             SelectSort_linklist(l1);
    407             cout<<"链式简单选择排序之后:"<<endl;
    408             print_linklist(l1);
    409             break;
    410         }
    411     case 10:
    412         {
    413             createLinkList(l1);
    414             cout<<"链式直接插入排序之前:"<<endl;
    415             print_linklist(l1);
    416             InsertSort_linklist(l1);
    417             cout<<"链式直接插入排序之后:"<<endl;
    418             InsertSort_linklist(l1);
    419             break;
    420         }
    421 
    422     case 11:
    423         {
    424             createLinkList(l1);
    425             cout<<"链式冒泡排序之前:"<<endl;
    426             print_linklist(l1);
    427             BubbleSort_linklist(l1);
    428             cout<<"链式冒泡排序之后:"<<endl;
    429             print_linklist(l1);
    430             break;
    431         }
    432 
    433 
    434 
    435 
    436     }
    437     cout<<"您是否还要继续测试其他函数?y/n"<<endl;
    438     fflush(stdin);
    439     char z;
    440     cin>>z;
    441     if (z=='y')
    442         goto ll1;
    443     else
    444     return 0;
    445 }
  • 相关阅读:
    植物:柏树
    植物:水杉
    植物:珙桐
    植物:桫椤
    汉语-成语:悠闲自在
    植物:孑遗植物
    汉语-词语:孑遗
    汉语-词语:调味品
    调味品:酱油
    netstat 命令详解
  • 原文地址:https://www.cnblogs.com/twomeng/p/9476710.html
Copyright © 2011-2022 走看看