链表版冒泡排序

  基本原理就是尾插法建立链表(当然,也可以用头插法建立链表),重点是冒泡排序法中的两层for循环的参数设置,设置两个链表指针p、q:

  第一个用来指向头结点后一个(p = head ->next)(p还有个作用就是排序的步骤数),第二个用来指向头结点后一个的后一个(q = p -> next),每次内层循环q指针往后移一个结点,然后和第一个节点存储的数据相比较,完成交换,直到第一次排序完毕为止,整个过程中,p指针一直指向的是第一个数。第二次,p就指向后一个节点,q指向p所指向的节点的后一个节点,然后同前面的操作一样,依次类推。其实实际上就像用指针做冒泡排序时一样。

  用图形可视化来描述这个过程肯定更能清晰一些,这里用五个数(5、4、3、2、1)来做例子(图中p、q 是链表指针):

  综上所述,我们可以写出冒泡排序代码:

typedef struct sortLinkList
{
    int data;
    struct sortLinkList * next;
}sortLinkList;

/*
 *****************************
 * 初始条件:已创建链表sortLinkList
 * 设置两个链表指针 sortLinkList *p, *q
 * int s; s用做完成数据交换的容器
 *****************************
 */
for(p = head -> next; p != NULL; p = p -> next)
      for(q = p -> next; q != NULL; q = q -> next)
           if((p -> data) > (q -> data))
               s = q -> data, q -> data = p -> data, p -> data = s;

  实在不会的小伙伴请看这里

  完整代码:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define N 100

typedef int Element;

typedef struct sortLinkList
{
    Element data;
    struct sortLinkList * next;
}sortLinkList;

sortLinkList * head, * tail, * current;

int main()
{
    int i;
    sortLinkList * p, * q;
    Element swap;

    head = (sortLinkList *)malloc(sizeof(sortLinkList));
    tail = head;
    srand(time(0));
    for(i = 0; i < N; i++)
    {
        current = (sortLinkList *)malloc(sizeof(sortLinkList));
        current -> data = rand()%N*20 + 1;
        tail-> next = current;
        tail = current;
    }

    tail -> next = NULL;

    for(p = head -> next; p != NULL; p = p -> next)
        for(q = p -> next; q != NULL; q = q -> next)
            if((p -> data) > (q -> data))
                swap = q -> data, q -> data = p -> data, p -> data = swap;

    p = head -> next;
    while(p)
    {
        printf("%d ",p -> data);
        p = p -> next;
    }
    putchar(‘\n‘);

    return 0;
}

sortLinkList

时间: 2024-12-25 02:17:41

链表版冒泡排序的相关文章

java8 函数式版 冒泡排序(BubbleSort)

package com.doctor.algorithm.sort; import java.util.Arrays; import java.util.function.BiPredicate; /**  * java8 函数式版 冒泡排序(BubbleSort)  *   * @author doctor  *  * @time 2015年4月26日 下午9:31:03  */ public class BubbleSort { public static void main(String[

C#版冒泡排序优化

之前写了一个C#版冒泡排序的实现.由于之前的版本是用两层for循环来实现的,这个版本的排序还是有进一步优化的空间的. 之前的排序: int temp = 0; for (int i = arr.Length - 1; i > 0; i--) { for (int j = 0; j < i; j++) { if (arr[j] > arr[j + 1]) { temp = arr[j + 1]; arr[j + 1] = arr[j]; arr[j] = temp; } } } 能够看出,

经典算法学习——链表实现冒泡排序

我在之前一篇博客<经典算法学习--冒泡排序>中简单实现了使用数组进行冒泡排序.这篇博客我们将来实现使用链表如何排序,其实整体的思路是一样的.示例代码上传至: https://github.com/chenyufeng1991/BubbleSortLinkedList . 算法描述如下: (1)比较相邻的前后两个数据,如果前面数据大于后面的数据,就将两个数据交换: (2)这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就到了最后一个位置,也就是下标为N-1的位置(沉到了水底).

C#版冒泡排序

最近在看C#的语法,通过跟Java对比还是能看出很多不同的设计思路,挺新颖的.学习语言就是这样,不一定是为了精通,但是可以看出不同的理念. 用C#写了一个冒泡排序: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _03数组的冒泡排序 { class Program { static void

python版冒泡排序

从第一个元素开始,对数组中两两相邻的元素比较,将值较小的元素放在前面,值较大的元素放在后面,一轮比较完毕,一个最大的数沉底成为数组中的最后一个元素,一些较小的数如同气泡一样上浮一个位置.n个数,经过n-1轮比较后完成排序. 假定有下标为0-n的n+1个数的序列,要求按升序排列,实现的步骤如下: (1)从第0个元素开始与后一个比较,如果比后大两元素交换,依次比较到第n个元素,最终将最大的数换入第n个元素中,a(n)不动 (2)重复(1) ,依次比较到第n-1个元素,最终将最大的数换入第n-1个元素

链表的冒泡排序

#include<stdio.h> #include<stdlib.h> struct link { int data; struct link *next; }; struct link *invent(void); struct link *sort(struct link *head); void outp(struct link *head); int main() { struct link *head,*p; printf("创建一个链表.\n");

Python版冒泡排序算法

0 为什么写本文 一方面对经典排序算法冒泡排序进行复习,另一方面通过实际应用来检验python基础知识的掌握情况,包括range函数.len函数.for循环.if语句.函数定义与调用.列表的排序等知识点.在实践中加深理解,达到学以致用.用以促学.学用相长的目的. 1 什么是冒泡排序 冒泡排序的基本思想是,将需要排序的元素看作是一个个"气泡",最小的"气泡"最快浮出水面,排在前面.较小的"气泡"排在第二个位置,依次类推.冒泡排序需要对数列循环若干次

汇编版冒泡排序

初学汇编,老师让写个冒泡排序出来,带提示语句的,于是我就写了一个. 这个程序目前只支持8个数及以内的排序,排序的数值范围最大为255. 用到的东西都很简单,只用了基本的寄存器和jmp运算. DATAS SEGMENT ;用于存放用户输入 a1 db 0,0,0,0,0,0,0,0 tips db "input a number:$" confirm db "Your input:$" sort_output db "After sorted:$"

标准约瑟夫问题链表版

type point=^node; node=record data:longint; next:point; end; var h,s,p,q:point; m,n,i,t:longint; begin readln(n,m); //create the linked list new(s); h:=s; s^.data :=1; p:=s; for i:=2 to n do begin new(s); s^.data:=i; p^.next:=s; p:=s; end; p^.next:=h