单链表的插入排序、冒泡排序和选择排序(交换指针)

原创 2018年04月17日 17:15:03

这里并不详细描述它们具体的操作过程,只简单谈谈思路,并贴上代码,应该很容易理解的。(自己亲自用手画画会更容易理解)

插入排序:我们先摘下第一个节点,即也就是以有序序列为一个新的链表,选取第二个节点为key node,将后面的节点与之比较,将大于或等于key node的节点插入到新链表中合适的位置。

冒泡排序:每次从链表的第一个节点开始向后扫描,每次比较将相邻的两个节点并将它们放到正确的位置(这里的相关指针操作比较麻烦点)。我们用一个指示变量来判断在一次遍历过程中是否发生过交换,如果没有发生过交换,则说明链表已排好序。

选择排序:思路同数组的选择排序。

三种排序算法的代码如下:

/*  insertion_sort_sll函数:用插入排序对单链表进行排序  */
void insertion_sort_sll(struct nlist **nextp)
{
    struct nlist **pre;
    struct nlist *new;
    struct nlist *key;

    if (*nextp == NULL)
        return;

    key = (*nextp)->next;
    (*nextp)->next = NULL;
    while (key != NULL) {
        pre = nextp;
        while (*pre != NULL && (*pre)->val < key->val)
            pre = &(*pre)->next;
        new = key->next;
        key->next = *pre;
        *pre = key;
        key = new;
    }
} 
/*  bubble_sort_sll函数:用冒泡排序对单链表进行排序  */
void bubble_sort_sll(struct nlist **nextp)
{
    struct nlist **pre;
    struct nlist **cur;
    struct nlist *p;      /*  两个临时指针  */
    struct nlist *q;
    enum {NO, YES};
    int exchange = YES;

    while (exchange == YES) {
        cur = nextp;
        exchange = NO;
        while (*cur != NULL && (*cur)->next != NULL)
            if ((*cur)->val > (*cur)->next->val) {
                exchange = YES;
                pre = &(*cur)->next->next;
                p = *cur;
                q = *pre;
                *pre = *cur;
                *cur = (*cur)->next;
                p->next = q;
                cur = pre;
            } else
                cur = &(*cur)->next;
    }
}
/*  selection_sort_sll函数:用选择排序对单链表进行排序  */
void selection_sort_sll(struct nlist **nextp)
{
    struct nlist **cur;
    struct nlist **p_min;
    struct nlist *head;

    for (head = *nextp; head != NULL; nextp = &(*nextp)->next) {
        p_min = &head;
        cur = &head->next;
        for ( ; *cur != NULL; cur = &(*cur)->next)
            if ((*cur)->val < (*p_min)->val)
                p_min = cur;
        *nextp = *p_min;
        *p_min = (*p_min)->next;
        (*nextp)->next = NULL;
    }
}

有不太如意之处,希望大家多多指正。

数据结构JAVA版2017教学视频课程

本课程共28个教学视频课程,22小时的教学时间,深入浅出的理论讲解,用JAVA语言实现每个知识点的代码,大量的上机练习题讲解,通过家家乐停车场,佳佳乐彩票机,佳佳乐通讯录,编译原理的语法分析等项目的综合应用实训,上课PPT,上课源代码等资料可以直接下载使用
  • 2017年03月31日 13:31

C++基于链表 指针的插入排序,冒泡排序,选择排序,计数排序

最近学习数据结构的排序算法,网上找了好多资料,发显基于数组的排序算法有很多,但基于链表的排序算法很乱,资源正确性也不一定,所以自己尝试调试了一下,如下: 1.插入排序 如下的图片阐释了如何交换链表...
  • ljw498066009
  • ljw498066009
  • 2013-10-25 17:16:12
  • 2250

基础排序总结(冒泡排序、选择排序、插入排序)

1、冒泡排序1.1、简介与原理冒泡排序算法运行起来非常慢,但在概念上它是排序算法中最简单的,因此冒泡排序算法在刚开始研究排序技术时是一个非常好的算法。冒泡排序原理即:从数组下标为0的位置开始,比较下标...
  • u013249965
  • u013249965
  • 2016-09-18 16:08:55
  • 4631

【算法】插入排序/冒泡排序/选择排序

插入排序 插入排序的思想为:从数组的第二个元素开始遍历整个数组。针对每个元素,依次将其前面的所有元素和他进行比较,大于它的元素均向后移动,最后将该元素插入。 插入排序是一种稳定的排序算法。 时间...
  • cauchyweierstrass
  • cauchyweierstrass
  • 2015-11-10 20:33:52
  • 1973

冒泡排序,选择排序,插入排序的区别

#include int swap(int *a,int *b) { int t=*a; *a=*b; *b=t; } /* 冒泡排序的原理:每次在无序队列里将相邻两个数依...
  • wdkirchhoff
  • wdkirchhoff
  • 2014-12-07 14:02:56
  • 9999

JAVA中常见的四种排序--冒泡排序、选择排序、插入排序和快速排序 详解

1、排序的介绍 排序是将一群数据,按照指定的顺序进行排列的过程。 2、排序的分类 内部排序:指将需要处理的所有数据都加载到内部存储器中进行排序。包括(交换式排序、选择排序和插入排序) 外部排序:数据量...
  • zyj0813
  • zyj0813
  • 2017-10-20 16:20:24
  • 269

三种数组排序算法(冒泡排序、选择排序、插入排序、二分查找法)

冒泡法排序(BubbleSort)特点: 两两相邻比较int[] arr = new int[]{1,7,2,5,4,8,6,9,10,3}; for(int i = 0; i < arr....
  • qq_36057752
  • qq_36057752
  • 2016-09-07 17:49:26
  • 229

小练习 - 单链表冒泡排序,交换指针域

链表的排序,好的做法是交换指针域。链表节点的数据域可能比较大,交换数据域可能会涉及拷贝过多的内存,影响性能。链表是链式存储,无法随机访问(base_addr + offset), 所以比较适合的办法是...
  • thisinnocence
  • thisinnocence
  • 2018-02-18 14:29:54
  • 95

java实现各种排序算法(包括冒泡排序,选择排序,插入排序,快速排序(简洁版))及性能测试

1、冒泡排序是排序里面最简单的了,但性能也最差,数量小的时候还可以,数量一多,是非常慢的。      它的时间复杂度是O(n*n),空间复杂度是O(1)      代码如下,很好理解。 ...
  • qq_21439971
  • qq_21439971
  • 2016-12-27 14:36:43
  • 8431

链表的冒泡排序(节点交换法)

链表冒泡排序,可以通过修改节点值和交换节点两种方法,下面给出交换节点的方法。 #include #include struct Node{ int data; Node *next; }; ...
  • u011739410
  • u011739410
  • 2015-05-10 10:48:17
  • 3113
收藏助手
不良信息举报
您举报文章:单链表的插入排序、冒泡排序和选择排序(交换指针)
举报原因:
原因补充:

(最多只允许输入30个字)