当前位置:   article > 正文

【数据结构实验】上机实验11:几种典型排序算法的实现编程实现:分别利用直接插入/折半插入/希尔/冒泡/快速/简单选择排序算法_输入一组无序数据,分别使用直接插入排序、折半插入算法、冒泡排序、简单选择排序

输入一组无序数据,分别使用直接插入排序、折半插入算法、冒泡排序、简单选择排序

一、实验要求

上机实验题11:几种典型排序算法的实现

编程实现:分别利用直接插入/折半插入/希尔/冒泡/快速/简单选择排序算法实现将待排序序列{3,6,2,10,1,20,88,8,5,7,4,9}由小到大排序,并输出结果。

二、实验源代码和运行结果

(一)源代码

  1. #include<iostream>
  2. using namespace std;
  3. typedef int ElemType;
  4. #define N 20
  5. typedef struct
  6. {
  7. ElemType key;
  8. }RecType;
  9. RecType t;//用于交换的变量t定义成全局
  10. //冒泡排序
  11. void BubbleSort(RecType R[],int n)
  12. {
  13. int i,j;
  14. for(i=0;i<n-1;i++)
  15. for(j=0;j<n-1;j++)
  16. if(R[j].key>R[j+1].key)
  17. {
  18. t.key=R[j].key;
  19. R[j].key=R[j+1].key;
  20. R[j+1].key=t.key;
  21. }
  22. }
  23. //选择排序
  24. void SelectSort(RecType R[],int n)
  25. {
  26. int i,j,k;
  27. for(i=0;i<n-1;i++)
  28. {
  29. k=i;
  30. for(j=i+1;j<n;j++)
  31. if(R[k].key>R[j].key)
  32. k=j;
  33. if(k!=i)
  34. {
  35. t.key=R[k].key;
  36. R[k].key=R[i].key;
  37. R[i].key=t.key;
  38. }
  39. }
  40. }
  41. //直接插入排序
  42. void InsertSort(RecType R[],int n)
  43. {
  44. int i,j;
  45. for(i=0;i<n;i++)//4.写的for截止条件是i<n-1,导致少遍历了一个元素,输出结果最后那个元素仍是存在逆序,改为i<n就行了
  46. {
  47. if(R[i].key<R[i-1].key)//如果遇到首个逆序,刚好从有序区进入无序区
  48. {//3.if下面的这对括号也没加,导致输出结果是一串零并且提示R[]未进行初始化而强制停止程序
  49. t=R[i];//先将无序区首个元素存起来,方便前面元素后移为它腾空,而又不被覆盖住
  50. j=i-1;//将这个元素下标赋给j,j能使有序区元素后移而又不改变当前插入的趟数i
  51. do{
  52. R[j+1]=R[j];//有序区元素后移
  53. j--;
  54. }while(j>=0&&R[j].key>t.key);//停止条件有两个,要么有序区已经遍历移动完毕,要么有序区已经遍历到第一个小于待插入元素的数,就可以进行插入了(此时待插入元素要插在找到的元素下一个位置)
  55. R[j+1]=t;//2.这句写在了下面那个花括号后面,导致调用display函数后的结果全是地址
  56. }//1.忘记在for循环下加花括号了,导致if下面的语句成顺序执行了,只执行一遍
  57. }
  58. }
  59. //折半插入
  60. void BinInsertSort(RecType R[],int n)
  61. {
  62. int i,j,low,high,mid;
  63. for(i=1;i<n;i++)
  64. {
  65. if(R[i].key<R[i-1].key)
  66. {
  67. t=R[i];
  68. low=0;
  69. high=i-1;
  70. while(low<=high)
  71. {
  72. mid=(low+high)/2;
  73. if(t.key<R[mid].key)
  74. high=mid-1;
  75. else
  76. low=mid+1;
  77. }
  78. for(j=i-1;j>=high+1;j--)
  79. R[j+1]=R[j];
  80. R[high+1]=t;
  81. }
  82. }
  83. }
  84. //希尔排序
  85. void ShellSort(RecType R[],int n)
  86. {
  87. int i,j,d;
  88. d=n/2;
  89. while(d>0)
  90. {
  91. for(i=d;i<n;i++)
  92. {
  93. t=R[i];
  94. j=i-d;
  95. while(j>=0&&t.key<R[j].key)
  96. {
  97. R[j+d]=R[j];
  98. j=j-d;
  99. }
  100. R[j+d]=t;
  101. }
  102. d/=2;
  103. }
  104. }
  105. //快速排序
  106. int partition(RecType R[],int s,int t)
  107. {
  108. int i=s,j=t;
  109. RecType tmp=R[i];
  110. while(i<j)
  111. {
  112. while(j>i&&R[j].key>=tmp.key)
  113. j--;
  114. R[i]=R[j];
  115. while(i<j&&R[i].key<=tmp.key)
  116. i++;
  117. R[j]=R[i];
  118. }
  119. R[i]=tmp;
  120. return i;
  121. }
  122. void QuickSort(RecType R[],int s,int t)
  123. {
  124. int i;
  125. if(s<t)
  126. {
  127. i=partition(R,s,t);
  128. QuickSort(R,s,i-1);
  129. QuickSort(R,i+1,t);
  130. }
  131. }
  132. //输出
  133. void Display(RecType R[],int n)
  134. {
  135. for(int i=0;i<n;i++)
  136. cout<<R[i].key<<" ";
  137. cout<<endl;
  138. }
  139. //主面板(显式)
  140. void Interface()
  141. {
  142. cout<<"请输入想要使用的排序算法:(输入序号即可)"<<endl;
  143. cout<<"1.冒泡排序算法"<<endl;
  144. cout<<"2.选择排序算法"<<endl;
  145. cout<<"3.直接插入排序算法"<<endl;
  146. cout<<"4.折半插入排序算法"<<endl;
  147. cout<<"5.希尔排序算法"<<endl;
  148. cout<<"6.快速排序算法"<<endl;
  149. }
  150. //选择匹配面板(隐式)
  151. void Select(RecType R[],int n,int x)
  152. {
  153. switch(x)
  154. {
  155. case 1:BubbleSort(R,n);break;
  156. case 2:SelectSort(R,n);break;
  157. case 3:InsertSort(R,n);break;
  158. case 4:BinInsertSort(R,n);break;
  159. case 5:ShellSort(R,n);break;
  160. case 6:QuickSort(R,1,n-1);break;
  161. };//这里忘记加分号了,一直报错。(这个地方很容易忽略!)
  162. Display(R,n);
  163. }
  164. int main()
  165. {
  166. system("color F0");
  167. int n=0,x;
  168. RecType R[N]={3,6,2,10,1,20,88,8,5,7,4,9};
  169. for(int i=0;i<N&&R[i].key!=0;i++)
  170. n++;
  171. cout<<"初始序列为:"<<endl;
  172. Display(R,n);
  173. cout<<endl;
  174. Interface();
  175. cin>>x;
  176. while(!(x==1||x==2||x==3||x==4||x==5||x==6))//如果输入错误就重新输入
  177. {
  178. system("cls");//清屏,更简洁
  179. cout<<"输入错误请重新输入!"<<endl<<endl;
  180. Interface();
  181. cin>>x;
  182. }
  183. cout<<"排序后的序列为:"<<endl;
  184. Select(R,n,x);
  185. }

(二)运行结果

三、实验总结

 这个实验,关键不是代码,而是这几种排序算法的核心思想,虽然搞懂它真的很费时间,但是一旦你明白了,在脑子里有个大体框架,就不会拘泥于代码层面。

以上仅是个人见解,狗头保命

 

实验课终于结束了,我终于不用每个周四晚上狂写10页实验报告,写到手指抽搐。我们这个老师,真的很让我痛苦。数据结构理论课,会在学习通布置很多视频和练习题,一章大概七八小节,一节一套练习题,一套3大概0来个题,有选择有填空。大概是这个样子的

 我真的会谢好吗,太多了,每天我课余时间,不是在补数据结构实验,就是在刷数据结构视频和做题,真的很心累。我太想放假了呜呜呜

 

 

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号