数据结构实验报告(六)

实验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 }

原文地址:https://www.cnblogs.com/twomeng/p/9476710.html

时间: 2024-11-13 03:37:51

数据结构实验报告(六)的相关文章

java项目——数据结构实验报告

java项目——数据结构总结报告 20135315  宋宸宁 实验要求 1.用java语言实现数据结构中的线性表.哈希表.树.图.队列.堆栈.排序查找算法的类. 2.设计集合框架,使用泛型实现各类. 3.API的编写,并导出. 4.使用TDD模式,对程序进行测试,利用TestSuite将各测试类整合到一起. 5.与小组成员实现代码的整合. 实验设计过程 首先自学集合框架章节的内容,初步设计相关的类. 根据数据结构课本的章节分类,实验各数据结构类. 在类的编写过程中,经过老师的指导,我准备使用泛型

数据结构实验报告(四)

实验报告4 图的有关操作 无向网的创建.求度.深度遍历.广度遍历 1 #include <iostream> 2 #include <stdlib.h> 3 #include <stdio.h> 4 #include <string> 5 #define MAX_VERTEX_NUM 20 6 7 using namespace std; 8 //1.建立无向网的邻接表 9 10 typedef int InfoType;//权值 11 typedef ch

实验报告六

20182313 2019-2020-1 <数据结构与面向对象程序设计>实验五报告 课程:<程序设计与数据结构> 班级:1823 姓名:刘尧 学号:20182313 实验教师:王志强 实验日期:2019年9月30日 必修/选修:必修 1.实验内容 1.Android Stuidio的安装测试: 参考<Java和Android开发学习指南(第二版)(EPUBIT,Java for Android 2nd)>第二十四章: 参考http://www.cnblogs.com/r

数据结构实验报告-实验四 图的构造与遍历

实验四   图的构造与遍历   l  实验目的 1.图的的定义和遍历 (1)掌握图的邻接矩阵.邻接表的表示方法. (2)掌握建立图的邻接矩阵的算法. (3)掌握建立图的邻接表的算法. (4)加深对图的理解,逐步培养解决实际问题的能力. l  实验内容 1.图的定义和遍历 (一)基础题 1.编写图基本操作函数: (1)CreateALGraph(ALGraph &G) 建立无向图的邻接表表示: (2)LocateVex(ALGraph &G,char v)图查找信息: (3)DFSTrave

数据结构实验报告-实验一 顺序表、单链表基本操作的实现

实验一    顺序表.单链表基本操作的实现   l  实验目的 1.顺序表 (1)掌握线性表的基本运算. (2)掌握顺序存储的概念,学会对顺序存储数据结构进行操作. (3)加深对顺序存储数据结构的理解,逐步培养解决实际问题的编程能力. l  实验内容 1. 顺序表 1.编写线性表基本操作函数: (1)InitList(LIST *L,int ms)初始化线性表: (2)InsertList(LIST *L,int item,int rc)向线性表的指定位置插入元素: (3)DeleteList1

数据结构实验报告-实验五 查找

实验五   查找   l  实验目的 1. 查找的基本概念 掌握在数组上进行各种查找的方法和算法. 深刻理解各种方法的特点,并能灵活运用. 加深对查找的理解,逐步培养解决实际问题的能力. l  实验内容 1.查找的基本概念 (一)基础题 1.编写各种查找方法的基本操作函数: (1)search1(int *k,int n,int key)无序线性表的顺序查找: (2)search2(int *k,int n,int key)有序线性表的顺序查找: (3)bin_search(int *k,int

第八周课程总结&amp;实验报告六

实验六 Java异常 实验目的 理解异常的基本概念: 掌握异常处理方法及熟悉常见异常的捕获方法. 实验要求 练习捕获异常.声明异常.抛出异常的方法.熟悉try和catch子句的使用. 掌握自定义异常类的方法. 实验内容 编写一个类,在其main()方法中创建一个一维数组,在try字句中访问数组元素,使其产生ArrayIndexOutOfBoundsException异常.在catch子句里捕获此异常对象,并且打印"数组越界"信息,加一个finally子句,打印一条信息以证明这里确实得到

第八周总结&amp;实验报告六

实验六 Java异常 实验目的 理解异常的基本概念: 掌握异常处理方法及熟悉常见异常的捕获方法. 实验要求 练习捕获异常.声明异常.抛出异常的方法.熟悉try和catch子句的使用. 掌握自定义异常类的方法. 实验内容 编写一个类,在其main()方法中创建一个一维数组,在try字句中访问数组元素,使其产生ArrayIndexOutOfBoundsException异常.在catch子句里捕获此异常对象,并且打印"数组越界"信息,加一个finally子句,打印一条信息以证明这里确实得到

实验报告六及总结

实验四 类的继承 一.实验目的 (1)理解异常的基本概念: (2)掌握异常处理方法及熟悉常见异常的捕获方法. 二.实验要求 (1)练习捕获异常.声明异常.抛出异常的方法.熟悉try和catch子句的使用. (2)掌握自定义异常类的方法. 三.实验内容 (一)编写一个类,在其main()方法中创建一个一维数组,在try字句中访问数组元素,使其产生ArrayIndexOutOfBoundsException异常.在catch子句里捕获此异常对象,并且打印"数组越界"信息,加一个finall