当前位置:   article > 正文

数据结构教程实验七链表排序的实现_本章使用顺序表作为存储结构,现请用链表实现第3题。

本章使用顺序表作为存储结构,现请用链表实现第3题。

实验七  链表排序的实现

一、实验目的

掌握链式存储结构下直接插入排序和简单选择排序的基本思想、排序过程、算法实现,并与顺序存储结构下实现进行对比。

二、实验环境

1.硬件:每个学生需配备计算机一台。

2.软件:Windows操作系统+Visual C++。

三、实验要求

1.建立一个先进先出的链表,采用链表实现直接插入排序、简单选择排序算法。

2. 比较各种算法的运行速度。

3. 输入数据:数据域(data)设定为整型。以关键字序列(265,301,751,129,937,863,742,694,76,438)作为输入数据,采用上述方法进行排序。

4.将建表、遍历表、简单选择排序和直接插入排序分别定义一个子函数,在主函数中调用它们。

四、实验内容

1.建表类C函数。

  1. void creat(linklist &L,int n)//创建单链表
  2. {
  3. L=(linklist)malloc(sizeof(Lnode));
  4. q=L;
  5. for(i=1;i<=n;i++)
  6. {
  7. p=(linklist)malloc(sizeof(Lnode));
  8. scanf(p->data);
  9. q->next=p;
  10. q=p;
  11. }
  12. q->next=NULL;
  13. }//创建完毕

2.直接插入排序的基本思想:每次将一个待排序的记录,按其关键字大小插入到前面已排序好的子文件中的适当位置,直到全部记录插入完成为止。

3.简单选择排序的基本思想:第i趟排序开始时,当前有序区和无序区分别为R[1‥i-1]和R[i‥n](1≤i≤n-1),该趟排序则是从当前无序区中选择出关键字最小的记录R[k],将它与无序区的的第一个记录R[i]交换,有序区增加一个记录,使R[1‥i],和R[i+1‥n]分别为新的有序区和新的无序区。如此反复进行,直到排序完毕。

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. //定义存储结构
  4. typedef int KeyType;
  5. typedef int InfoType;
  6. typedef struct{
  7. KeyType key;
  8. InfoType data;
  9. }RecType;
  10. //遍历顺序表
  11. void Trabser(RecType R[],int n){
  12. int i;
  13. for(i=0;i<n;i++){
  14. printf("%5d%5d\n",R[i].key,R[i].data);
  15. }
  16. }

1.直接插入排序子函数

  1. void InsertSort(RecType R[],int n){
  2. int i,j;
  3. RecType tmp;
  4. for(i=1;i<n;i++){
  5. if(R[i].key<R[i-1].key){
  6. tmp=R[i];
  7. j=i-1;
  8. do{
  9. R[j+1]=R[j];
  10. j--;
  11. }while(j>=0 && R[j].key>tmp.key);
  12. R[j+1]=tmp;
  13. }
  14. }
  15. }

2.折半插入排序

  1. void BinInsertSort(RecType R[],int n){
  2. int i,j,low,high,mid;
  3. RecType tmp;
  4. for(i=1;i<n;i++){
  5. if(R[i].key<R[i-1].key){
  6. tmp=R[i];
  7. low=0;
  8. high=i-1;
  9. while(low<=high){
  10. mid=(low+high)/2;
  11. if(tmp.key<R[mid].key)
  12. high=mid-1;
  13. else
  14. low=mid+1;
  15. }
  16. for(j=i-1;j>=high+1;j--){
  17. R[j+1]=R[j];
  18. }
  19. R[j+1]=tmp;
  20. }
  21. }
  22. }

3.希尔排序

  1. void ShellSort(RecType R[],int n){
  2. int i,j,d;
  3. RecType tmp;
  4. d=n/2;
  5. while(d>0){
  6. for(i=d;i<n;i++){
  7. tmp=R[i];
  8. j=i-d;
  9. while(j>=0 && tmp.key<R[j].key){
  10. R[j+d]=R[j];
  11. j=j-d;
  12. }
  13. R[j+d]=tmp;
  14. }
  15. d=d/2;
  16. }
  17. }

4.冒泡排序

  1. void BubbleSort(RecType R[],int n){
  2. int i,j;
  3. RecType tmp;
  4. for(i=0;i<n-1;i++){
  5. for(j=n-1;j>i;j--){
  6. if(R[j].key<R[j-1].key){
  7. tmp=R[j];
  8. R[j]=R[j-1];
  9. R[j-1]=tmp;
  10. }
  11. }
  12. }
  13. }

4.1改进的冒泡排序

  1. void BubbleSort1(RecType R[],int n){
  2. int i,j;
  3. bool exchange;
  4. RecType tmp;
  5. for(i=0;i<n-1;i++){
  6. exchange=false;
  7. for(j=n-1;i>i;j--){
  8. if(R[j].key<R[j-1].key){
  9. tmp=R[i];
  10. R[j]=R[j-1];
  11. R[j-1]=tmp;
  12. exchange=true;
  13. }
  14. }
  15. if(!exchange) return;
  16. }
  17. }

5.快速排序

  1. int partition(RecType R[],int s,int t){
  2. int i=s,j=t;
  3. RecType tmp=R[i];
  4. while(i<i){
  5. while(j>i && R[j].key>=tmp.key) j--;
  6. R[i]=R[j];
  7. while(i<j&&R[i].key<=tmp.key) i++;
  8. R[j]=R[i];
  9. }
  10. R[i]=tmp;
  11. return i;
  12. }
  13. void QuickSort(RecType R[],int s,int t){
  14. int i;
  15. if(s<t){
  16. i=partition(R,s,t);
  17. QuickSort(R,s,i-1);
  18. QuickSort(R,i+1,t);
  19. }
  20. }

6.简单选择排序

  1. void SelectSort(RecType R[],int n){
  2. int i,j,k;
  3. RecType tmp;
  4. for(i=0;i<n-1;i++){
  5. k=i;
  6. for(j=i+1;j<n;j++){
  7. if(R[j].key<R[k].key) k=j;
  8. }
  9. if(k!=i){
  10. tmp=R[i];
  11. R[i]=R[k];
  12. R[k]=tmp;
  13. }
  14. }
  15. }

7.堆排序

  1. void sift(RecType R[],int low,int high){
  2. int i=low,j=2*i;
  3. RecType tmp=R[i];
  4. while(i<=high){
  5. if(j<high && R[j].key<R[j+1].key) j++;
  6. if(tmp.key<R[j].key){
  7. R[i]=R[j];
  8. i=j;
  9. j=2*i;
  10. }
  11. else break;
  12. }
  13. R[i]=tmp;
  14. }
  15. void HeapSort(RecType R[],int n){
  16. int i;
  17. RecType tmp;
  18. for(i=n/2;i>=1;i--) sift(R,i,n);
  19. for(i=n;i>=2;i--){
  20. tmp=R[1];
  21. R[1]=R[i];
  22. R[i]=tmp;
  23. sift(R,1,i-1);
  24. }
  25. }
  26. //二路归并排序
  27. void Merge(RecType R[],int low,int mid,int high){
  28. RecType *R1;
  29. int i=low,j=mid+1,k=0;
  30. R1=(RecType *)malloc((high-low+1)*sizeof(RecType));
  31. while(i<=mid && j<=high){
  32. if(R[i].key<=R[j].key){
  33. R1[k]=R[i];
  34. i++;
  35. k++;
  36. }
  37. else{
  38. R1[k]=R[j];
  39. j++;
  40. k++;
  41. }
  42. }
  43. while(i<=mid){
  44. R1[k]=R[i];
  45. i++;
  46. k++;
  47. }
  48. while(j<=high){
  49. R1[k]=R[j];
  50. j++;
  51. k++;
  52. }
  53. for(k=0,i=low;i<=high;k++,i++){
  54. R[i]=R1[k];
  55. }
  56. free(R1);
  57. }
  58. //对整个排序序列进行一趟归并
  59. void MergePass(RecType R[],int length,int n){
  60. int i;
  61. for(i=0;i+2*length-1<n;i=i+2*length)
  62. Merge(R,i,i+length-1,i+2*length-1);
  63. if(i+length-1<n-1)
  64. Merge(R,i,i+length-1,n-1);
  65. }
  66. void MergeSort(RecType R[],int n){
  67. int length;
  68. for(length=1;length<n;length=2*length)
  69. MergePass(R,length,n);
  70. }
  71. void main(){
  72. RecType a[10]={{3,4},{5,4},{1,2},{6,5},{2,2},{13,4},{0,99},{11,54},{15,23},{7,9}};
  73. Trabser(a,10);
  74. printf("堆排序:\n");
  75. HeapSort(a,10);
  76. Trabser(a,10);
  77. printf("直接插入排序:\n");
  78. InsertSort( a,10);
  79. Trabser(a,1);
  80. printf("折半直接插入排序:\n");
  81. BinInsertSort(a,10);
  82. Trabser(a,10);
  83. printf("希尔排序:\n");
  84. ShellSort(a,10);
  85. Trabser(a,10);
  86. printf("冒泡排序:\n");
  87. BubbleSort(a,10);
  88. Trabser(a,10);
  89. printf("快速排序:\n");
  90. QuickSort(a,0,9);
  91. Trabser(a,10);
  92. printf("简单选择排序:\n");
  93. SelectSort(a,10);
  94. Trabser(a,10);
  95. printf("二路归并排序:\n");
  96. MergeSort(a,10);
  97. Trabser(a,10);
  98. printf("堆排序:\n");
  99. HeapSort(a,10);
  100. Trabser(a,10);
  101. }

五、思考题

1.在链式存储结构下实现冒泡排序。

实现程序:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. typedef int ElemType;
  4. typedef struct Node
  5. {
  6. ElemType pData;
  7. Node* pNext;
  8. }Node,*pList;
  9. void Init(pList* ihead)
  10. {
  11. *ihead = (pList)malloc(sizeof(Node));
  12. if (*ihead == NULL)exit(0);
  13. (*ihead)->pNext = NULL;
  14. (*ihead)->pData = 0;
  15. }
  16. void Insert(pList head, ElemType val)
  17. {
  18. pList pCur = head;
  19. for (int i = 0; i < head->pData; ++i)
  20. {
  21. pCur = pCur->pNext;
  22. }
  23. pList newNode = (pList)malloc(sizeof(Node));
  24. newNode->pData = val;
  25. newNode->pNext = NULL;
  26. pCur->pNext = newNode;
  27. head->pData++;
  28. }
  29. void Show(pList head)
  30. {
  31. pList pCur = head->pNext;
  32. for (int i = 0; i < head->pData; ++i)
  33. {
  34. printf("%d ", pCur->pData);
  35. pCur = pCur->pNext;
  36. }
  37. printf("\n");
  38. }
  39. void ListSort(pList head)
  40. {
  41. pList pCur = head->pNext;
  42. pList pAfter = pCur;
  43. for (int i = 0; i < head->pData - 1; ++i)
  44. {
  45. pCur = head->pNext;
  46. pAfter = pCur->pNext;
  47. for (int j = 0; j < head->pData - i-1; ++j)
  48. {
  49. if (pAfter->pData < pCur->pData)
  50. {
  51. ElemType tmp = pAfter->pData;
  52. pAfter->pData = pCur->pData;
  53. pCur->pData = tmp;
  54. }
  55. pCur = pCur->pNext;
  56. pAfter = pAfter->pNext;
  57. }
  58. }
  59. }
  60. void Destroy(pList head)
  61. {
  62. pList pCur = head;//->pNext;
  63. for(int i=0;i<head->pData-1;i++)
  64. {
  65. head->pNext = pCur ->pNext;
  66. free(pCur);
  67. }
  68. }
  69. //主函数
  70. void main()
  71. {
  72. pList head;
  73. Init(&head);
  74. for (int i = 0; i < 10; ++i)
  75. {
  76. Insert(head, rand()%10+1);
  77. }
  78. Show(head);
  79. ListSort(head);
  80. Show(head);
  81. Destroy(head);
  82. }

运行结果:

测试结果:

通过!

2.在链式存储结构下快速排序。

实现程序:

  1. #include <iostream>
  2. #include <ctime>
  3. #define LEN 20
  4. #define MAX_VAL 100
  5. using namespace std;
  6. // 链式结构元素
  7. struct elem
  8. {
  9. elem()
  10. {
  11. value = 0;
  12. next = NULL;
  13. }
  14. int value;
  15. elem * next;
  16. };
  17. // 链式结构
  18. struct node
  19. {
  20. node()
  21. {
  22. head = tail = NULL;
  23. }
  24. elem* head;
  25. elem* tail;
  26. };
  27. // 比较函数
  28. int compare_node(elem* elem_1, elem* elem_2)
  29. {
  30. if(elem_1->value < elem_2->value)
  31. {
  32. return -1;
  33. }
  34. else if(elem_1->value == elem_2->value)
  35. {
  36. return 0;
  37. }
  38. else
  39. {
  40. return 1;
  41. }
  42. }
  43. elem* partition(elem** head, elem* tail, int sort_type)
  44. {
  45. elem* newHead = *head;
  46. elem* headPtr = *head;
  47. elem* curPtr = (*head)->next;
  48. elem* prePtr = *head;
  49. while(curPtr != tail)
  50. {
  51. if(compare_node(headPtr, curPtr) == sort_type)
  52. {
  53. prePtr->next = curPtr->next;
  54. curPtr->next = newHead;
  55. newHead = curPtr;
  56. curPtr = prePtr->next;
  57. }
  58. else
  59. {
  60. prePtr = curPtr;
  61. curPtr = curPtr->next;
  62. }
  63. }
  64. *head = newHead;
  65. return headPtr;
  66. }
  67. void quickSort(elem** head, elem* tail, int sort_type)
  68. {
  69. if(*head == tail) return;
  70. elem* mid = partition(head, tail, sort_type);
  71. elem** head_1 = head;
  72. elem** head_2 = &mid->next;
  73. quickSort(head_1, mid, sort_type);
  74. quickSort(head_2, tail, sort_type);
  75. mid->next = *head_2;
  76. *head = *head_1;
  77. }
  78. //主函数
  79. void main()
  80. {
  81. node* nptr = new node();
  82. srand(time(NULL));
  83. for(int i = LEN; i >= 1; i--)
  84. {
  85. int value = rand() % MAX_VAL + 1;
  86. if(nptr->head == NULL)
  87. {
  88. nptr->head = nptr->tail = new elem();
  89. nptr->head->value = value;
  90. }
  91. else
  92. {
  93. elem* tempPtr = new elem();
  94. tempPtr->value = value;
  95. nptr->tail->next = tempPtr;
  96. nptr->tail = nptr->tail->next;
  97. }
  98. }
  99. elem** tempHead = &(nptr->head);
  100. quickSort(tempHead, NULL, -1);
  101. nptr->head = *tempHead;
  102. elem* tempPtr = nptr->head;
  103. while(tempPtr)
  104. {
  105. cout<<tempPtr->value<<" ";
  106. tempPtr = tempPtr->next;
  107. }
  108. printf("\n");
  109. }

运行结果:

测试结果:

通过!

六、实验总结

通过本次实验学习了练习了链式存储的直接插入排序、简单选择排序、快速排序、冒泡排序等几种排序方式,对排序又有了新的认识。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/1006977
推荐阅读
相关标签
  

闽ICP备14008679号