欢迎访问有用文档网!

当前位置: 有用文档网 > 心得体会 >

《数据结构》实验报告——排序

| 浏览次数:

 《数据结构》实验报告

  排序 实验题目:

 输入十个数,从插入排序,快速排序,选择排序三类算法中各选一种编程实现。

 实验所使用得数据结构内容及编程思路:

 1、插入排序:直接插入排序得基本操作就是,将一个记录到已排好序得有序表中,从而得到一个新得,记录增一得有序表。

 一般情况下,第 i 趟直接插入排序得操作为:在含有i—1 个记录得有序子序列r[1、、i-1]中插入一个记录 r[i]后,变成含有 i 个记录得有序子序列r[1、、i];并且,与顺序查找类似,为了在查找插入位置得过程中避免数组下标出界,在 r[0]处设置哨兵。在自 i-1 起往前搜索得过程中,可以同时后移记录.整个排序过程为进行 n—1 趟插入,即:先将序列中得第一个记录瞧成就是一个有序得子序列,然后从第 2 个记录起逐个进行插入,直至整个序列变成按关键字非递减有序序列为止。

 2、快速排序:基本思想就是,通过一趟排序将待排记录分割成独立得两部分,其中一部分记录得关键字均比另一部分记录得关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。

 假设待排序得序列为{L、r[s],L、r[s+1],…L、r[t]},首先任意选取一个记录(通常可选第一个记录 L、r[s])作为枢轴(或支点)(pivot),然后按下述原则重新排列其余记录:将所有关键字较它小得记录都安置在它得位置之前,将所有关键字较大得记录都安置在它得位置之后。由此可以该“枢轴”记录最后所罗得位置 i 作为界线,将序列{L、r[s],…,L、r[t]}分割成两个子序列{L、r[i+1],L、[i+2],…,L、r[t]}。这个过程称为一趟快速排序,或一次划分。

 一趟快速排序得具体做法就是:附设两个指针 low与high,她们得初值分别为low与high,设枢轴记录得关键字为pivotkey,则首先从high所指位置起

 向前搜索找到第一个关键字小于 pivotkey 得记录与枢轴记录互相交换,然后从low所指位置起向后搜索,找到第一个关键字大于pivotkey得记录与枢轴记录互相交换,重复这两不直至 low=high 为止。

 具体实现上述算法就是,每交换一对记录需进行 3 次记录移动(赋值)得操作。而实际上,在排列过程中对枢轴记录得赋值就是多余得,因为只有在一趟排序结束时,即 low=high 得位置才就是枢轴记录得最后位置。由此可以先将枢轴记录暂存在 r[0]得位置上,排序过程中只作 r[low]或r[high]得单向移动,直至一趟排序结束后再将枢轴记录移至正确位置上. 整个快速排序得过程可递归进行。若待排序列中只有一个记录,显然已有序,否则进行一趟快速排序后再分别对分割所得得两个子序列进行快速排序. 3、简单选择排序:其操作为,通过 n-i 次关键字间得比较,从 n—i+1 个记录中选出关键字最小得记录,并与第 i(1≤i≤n)个记录交换之。

 显然,对 L、r[1…n]中得记录进行简单选择排序得算法为:令i从1至 n—1,进行 n—1 趟选择操作.可以瞧出,简单选择排序过程中,所需进行记录移动得操作次数较少,其最小值为“0",最大值为 3(n-1)。然后,无论记录得初始排列如何,所需进行得关键字之间得比较次数相同,均为 n(n—1)/2。

 程序清单:

 1.插入排序:

 #include〈stdio、h〉 struct sqlist {int key[11];

 int length; } insertsort(struct sqlist *l) { int i,j;

 for(i=2;i〈=l—>length;i++)

  if(l-〉key[i]〈l->key[i-1])

 {l->key[0]=l-〉key[i];

  l->key[i]=l-〉key[i-1];

 for(j=i-2;l—>key[0]<l—>key[j];j--)

 l—〉key[j+1]=l—>key[j];

 l—>key[j+1]=l—>key[0];

 } } main()

 { int i,j,k; struct sqlist num; num、length=10; for(i=1;i<=num、length;i++)scanf(”%d",&(num、key[i])); insertsort(&num); printf(“charu:”); for(i=1;i<=num、length;i++)printf (”%d ",num、key[i]); } 测试用例:

 输入:23 34 12 98 56 45 67 8 9 37

  输出:charu:8 9 12 23 34 37 45 56 67 98 2 快速排序:

 #include<stdio、h> struct sqlist { int key[11]; int length; }; int partition(struct sqlist *l,int low,int high) { int pivotkey; l->key[0]=l-〉key[low]; pivotkey=l->key[low]; while(low<high)

 {while(low<high&&l-〉key[high]〉=pivotkey)high--;

  l->key[low]=l->key[high];

 while(low<high&&l->key[low]<=pivotkey)low++;

 l-〉key[high]=l—>key[low]; } l->key[low]=l—>key[0]; return low; } void qsort(struct sqlist *l,int low,int high) {int pivotloc;

 if(low<high)

 {pivotloc=partition(l,low,high);

  qsort(l,low,pivotloc—1);

  qsort(l,pivotloc+1,high);

 } } void quicksort(struct sqlist *l) { qsort(l,1,l->length); } main()

 { int i,j; struct sqlist num; num、length=10; for(i=1;i<=num、length;i++)scanf(”%d",&(num、key[i])); quicksort(&num); printf(“kuaisu:”); for(i=1;i〈=num、length;i++)printf("%d ",num、key[i]); } 测试用例: 输入:23 34 12 98 56 45 67 8 9 37

  输出:charu:8 9 12 23 34 37 45 56 67 98 3选择排序:

 #include<stdio、h> struct sqlist {int key[11];

 int length; }; int selectminkey(struct sqlist *l,int a) { int i,j=a; for(i=a;i〈=l->length;i++)

 if(l—>key[i]<l->key[j])j=i;

  return j; } void selectsort (struct sqlist *l)

 {int i,j,k;

 for(i=1;i<l—>length;i++)

 {j=selectminkey(l,i);

  if(i!=j){k=l->key[i];

 l-〉key[i]=l->key[j];

 l—〉key[j]=k;}

 } } main()

 { int i,j; struct sqlist num; num、length=10; for(i=1;i〈=num、length;i++)scanf("%d”,&(num、key[i])); selectsort(&num); printf(“xuanze:”); for(i=1;i<=num、length;i++)printf(”%d ”,num、key[i]); } 测试用例:

 输入:23 34 12 98 56 45 67 8 9 37

 输出:charu:8 9 12 23 34 37 45 56 67 98 编程感想: 本次编程总共使用了三种排序方法,而这三种编程方法放在一起进行编写时,很容易就让我们对齐难易程度有了更深刻得了解。

 首先,三种排序中,我们都像查表那样,设置了哨兵,而哨兵得使用可以减少对整个表得验空操作,使程序更加节省空间。

 其次,对于插入排序,每次都要对一段序列进行检索,每排一次所要检索得序列长度减一,其时间发杂度为 O(n^2)。

 接着,对于快速排序,这个程序就是比较复杂得,总共就是3个函数,并且使用了递归得方法,这就是但就是,这种算法却就是最优越得,平均性能也就是最好得,我在编这个程序时,对其排序得思想有了进一步得了解,并努力拿她与冒泡排序进行比较,瞧出了些许其优越性。

 还有,就就是选择排序,简单选择排序思路简单,易于进行,但其时间发杂度与简单插入排序方法一样,都就是O(n^2),性能不如快速排序. 最后,本次试验就是数据结构课得最后一次实验,经过数据结构试验课得锻炼,使我对数据结构有了更深刻得理解,对我对其知识起到了重要得影响,增加了我编程得实践活动,为我将来进一步学习打下了基础。

推荐访问:数据结构 排序 实验

热门排行Top Ranking

新时代青年的奋斗精神心得体会5篇

新时代青年的奋斗精神心得体会5篇新时代青年的奋斗精神心得体会篇1为进一步弘扬爱国奋斗奉献精神,激励党

XX乡镇防止返贫致贫监测和帮扶工作方案

XX乡镇防止返贫致贫监测和帮扶工作方案 为认真落实党的十九届四中全会关于“坚决打赢脱贫攻

坚持总体国家安全观心得体会250字8篇

坚持总体国家安全观心得体会250字8篇坚持总体国家安全观心得体会250字篇1“安而不忘危,存而不忘亡

宣传部部长心得体会15篇

宣传部部长心得体会15篇宣传部部长心得体会篇1首先,感谢领导给我这次评选优秀员工的机会,也感谢您能在

管理信息系统案例

第一章 信息系统与管理 案例((或实例) 得讨论题及点评((或回答)) [实例]利润计划工作中得反复

大学生体育课心得体会1500字5篇

大学生体育课心得体会1500字5篇大学生体育课心得体会1500字篇1不知不觉,进入大学第一个学期的体

餐饮单位疫情防控工作汇报

餐饮单位疫情防控工作汇报根据省、市、区疫情防控指挥部统一部署,严格落实《省市场监督管理局关于进一步加

党支部党建工作年度台账-基层党建工作台账

党支部党建工作年度台账::基层党建工作台账 党支部党建工作年度台账说明为抓好党建工作,根据《党章》《

党员的时代楷模心得体会12篇

党员的时代楷模心得体会12篇党员的时代楷模心得体会篇1@党员干部“打工攻略”请查收一年一度的“双十一

公文格式国家标准

公文格式国家标准 1范围 本标准规定了党政机关公文通用的纸张要求、排版和印制装订要求、公文格式各要素

内勤辅警先进事迹材料

内勤辅警先进事迹材料3篇 内勤辅警先进事迹材料1 办公室工作室一项既辛苦、又清苦的脑力劳动,他没有惊

傅雷家书阅读心得及感悟10篇

傅雷家书阅读心得及感悟10篇傅雷家书阅读心得及感悟篇1一连几天,我都沉浸在《傅雷家书》这本书中,感受