单链表的排序(插入,选择,冒泡)

喜欢ヅ旅行 2022-12-29 04:48 216阅读 0赞

1.插入排序

链表的创建等系列操作代码详见单链表实现

  1. void Insert_Sort(LinkList &L) { // 插入排序,变更结点连接
  2. Node *p = L->next, *head; // p指针指向每次要插入的结点,head指针用于找到插入的位置
  3. Node *temp = p->next; // temp指针 指向 p指针后继结点,避免断链
  4. p->next = NULL; // 构造一个结点的有序表
  5. p = temp;
  6. while( p!= NULL ) {
  7. temp = p->next; // 保存 p指针后继结点
  8. head = L;
  9. while ( head->next != NULL && p->data > head->next->data)
  10. head = head->next; // 有序表中查找插入的位置
  11. p->next = head->next;
  12. head->next = p;
  13. p = temp;
  14. }
  15. }

2.选择排序

  1. void Select_Sort1(LinkList &L){ // 选择排序,变更结点连接
  2. Node *head = L, *p = head->next;
  3. head->next = NULL;
  4. for ( ; p!=NULL; ) {
  5. Node *minn = p, *min_pre; // *minn指向最小值结点, *min_pre指向*minn前一个,便于删除操作
  6. for ( Node *q = p; q->next!=NULL; q = q->next) {
  7. if ( minn->data > q->next->data ) {
  8. minn = q->next;
  9. min_pre = q;
  10. }
  11. }
  12. if( minn!=p) min_pre->next = minn->next; // 在当前链表中删除minn结点
  13. else p = p->next; //只有当minn==p,将p插入有序表时才需将p指向后继结点
  14. minn->next = NULL;
  15. head->next = minn; // 将minn结点插入到新有序表最后一位
  16. head = head->next;
  17. }
  18. }
  19. void Select_Sort2(LinkList &L){ // 选择排序,交换结点数据
  20. for ( Node *p = L->next; p->next!=NULL; p = p->next) {
  21. Node *minn = p;
  22. for ( Node *q = p->next; q!=NULL; q = q->next) {
  23. if( minn->data > q->data ) {
  24. minn = q;
  25. }
  26. }
  27. if( minn != p ) {
  28. ElemType t = minn->data;
  29. minn->data = p->data;
  30. p->data = t;
  31. }
  32. }
  33. }

3.冒泡排序

  1. void Bubble_Sort(Node *head){ // 冒泡排序,交换结点数据
  2. for ( Node *temp = head->next; temp->next != NULL; temp = temp->next ){
  3. for ( Node *p = head->next; p->next != NULL; p = p->next){
  4. if ( p->data > p->next->data ) {
  5. ElemType t = p->data;
  6. p->data = p->next->data;
  7. p->next->data = t;
  8. }
  9. }
  10. }
  11. }

实现

  1. #include<stdio.h>
  2. #include<malloc.h>
  3. #include<time.h>
  4. #define OK 1
  5. #define ERROR 0
  6. typedef int ElemType;
  7. typedef int Status;
  8. typedef struct node{
  9. ElemType data;
  10. node *next;
  11. }Node,*LinkList;
  12. Status CreatList(LinkList &L,int n){ //创建链表
  13. LinkList p,q;
  14. int i;
  15. L = (LinkList)malloc(sizeof(Node));
  16. q =L;
  17. for(int i=0; i<n; i++){
  18. p = (LinkList)malloc(sizeof(Node));
  19. scanf("%d",&p->data);
  20. q->next = p;
  21. q = p;
  22. }
  23. q->next = NULL;
  24. return OK;
  25. }
  26. void ListTraverse(LinkList L){ //遍历链表
  27. if(L->next == NULL)
  28. printf("LinkList is empty!!!");
  29. else{
  30. LinkList p;
  31. p = L->next;
  32. while(p!= NULL){
  33. printf("%d ",p->data);
  34. p = p->next;
  35. }
  36. printf("\n");
  37. }
  38. }
  39. void Bubble_Sort(Node *head) { //冒泡排序,交换结点数据
  40. for ( Node *temp = head->next; temp->next != NULL; temp = temp->next ){
  41. for ( Node *p = head->next; p->next != NULL; p = p->next){
  42. if ( p->data > p->next->data ) {
  43. ElemType t = p->data;
  44. p->data = p->next->data;
  45. p->next->data = t;
  46. }
  47. }
  48. }
  49. }
  50. void Select_Sort2(LinkList &L){ // 选择排序,交换结点数据
  51. for ( Node *p = L->next; p->next!=NULL; p = p->next) {
  52. Node *minn = p;
  53. for ( Node *q = p->next; q!=NULL; q = q->next) {
  54. if( minn->data > q->data ) {
  55. minn = q;
  56. }
  57. }
  58. if( minn != p ) {
  59. ElemType t = minn->data;
  60. minn->data = p->data;
  61. p->data = t;
  62. }
  63. }
  64. }
  65. void Select_Sort1(LinkList &L){ // 选择排序,变更结点连接
  66. Node *head = L, *p = head->next;
  67. head->next = NULL;
  68. for ( ; p!=NULL; ) {
  69. Node *minn = p, *min_pre;
  70. for ( Node *q = p; q->next!=NULL; q = q->next) {
  71. if ( minn->data > q->next->data ) {
  72. minn = q->next;
  73. min_pre = q;
  74. }
  75. }
  76. if( minn!=p) min_pre->next = minn->next;
  77. else p = p->next;
  78. minn->next = NULL;
  79. head->next = minn;
  80. head = head->next;
  81. }
  82. }
  83. void Insert_Sort(LinkList &L) { // 插入排序,变更结点连接
  84. Node *p = L->next, *head;
  85. Node *temp = p->next;
  86. p->next = NULL;
  87. p = temp;
  88. while( p!= NULL ) {
  89. temp = p->next;
  90. head = L;
  91. while ( head->next != NULL && p->data > head->next->data)
  92. head = head->next;
  93. p->next = head->next;
  94. head->next = p;
  95. p = temp;
  96. }
  97. }
  98. int main(){
  99. LinkList L;
  100. printf("输入10个数:\n");
  101. CreatList(L,10);
  102. printf("初始化10个元素,分别是:\n");
  103. ListTraverse(L);
  104. Select_Sort1(L);
  105. printf("升序排序输出链表:\n");
  106. ListTraverse(L);
  107. return OK;
  108. }
  109. // 23 12 13 44 55 21 89 76 67 9

发表评论

表情:
评论列表 (有 0 条评论,216人围观)

还没有评论,来说两句吧...

相关阅读

    相关 插入排序算法

    如果数据存储在一段连续的内存上,比如数组中,插入排序算法的实现相信大家都已经非常熟悉,如果要对一个单链表进行插入排序,将会牵扯到大量指针操作。 同时,如果在实现的过