冒泡排序——数组&链表

Posted zhulmz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了冒泡排序——数组&链表相关的知识,希望对你有一定的参考价值。

排序过程

对一组数据排序,例如 【5 、2、3、1、4】

  • 第一轮排序后 【2、3、1、4、5】
  • 第二轮排序后 【2、1、3、4、5】
  • 第三轮排序后 【1、2、3、4、5】

数组的冒泡排序

    int flag=0,temp;
    int s[10]={9,8,7,6,5,4,3,2,1,0};  //定义数组并赋值
    for(int i=0;i<10;i++)
    {
        for(int j=0;j<10-i-1;j++)
        {
            if(s[j]>s[j+1]){
            temp=s[j];
            s[j]=s[j+1];
            s[j+1]=temp;
                flag=1;
            }
        }
        if(flag==0)
            break;
    }

上述代码,外层循环控制循环的次数,最坏的情况下循环10次排序完成;内层循环控制比较个数;flag用来判断是否发生交换,如果没发生交换,则说明已经排序完成,则不需要接着循环到10次;

链表的冒泡排序

下面代码针对的是不带头节点(即第一个结点的数据域不为空)的链表

void swap(){
    STUDENT *head_front ;
    head_front=(STUDENT *)malloc(sizeof(STUDENT)); //为链表设置一个数据域为空的头节点
    head_front->next=head;    
    STUDENT *t, *p,*q,*temp;
    for(int i=0;i<sum+1;i++)  //上面加了一个结点,所以这而是sum+1
    {
        int flag = 1;
        t=head_front;
        p=t->next;
        q=p->next;
        for(int j=0;j<sum-i-1;j++)
        {
            if(p->num > q->num)
            {
                t->next = q;
                p->next = q->next;
                q->next = p;
                temp = p; p = q;q = temp;
                flag = 0;   
            }
            t = t->next;
            p = t->next;
            q = p->next;
        }
        if(flag)
            break;
    }
    free(head_front);  //排序完成后释放掉内存
}

上面的代码只能实现链表第一个元素比第二个元素小的排序,研究了好长时间,我也不知道为什么,等我弄明白之后在回来修改;

完整代码

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

typedef struct student
{
    int num;
    char name;
    struct student *next;
    
}STUDENT;

STUDENT *head;
int sum;

void create(){
    int num1;
    char name1;
    STUDENT *p_end=NULL,*p_new;
    int i=0;
    printf("请输入元素个数:");
    scanf("%d",&sum);
    for(int t=0;t<sum;t++)
    {
        printf("第%d个学生信息:",++i);
        scanf("%d %c",&num1,&name1);
        if(getchar()=='%')
            break;
        p_new=(STUDENT *)malloc(sizeof(STUDENT));
        if(p_new==NULL)
            exit(0);
        if(i==1)
        {
            p_new->name=name1;
            p_new->num=num1;
            head=p_new;
            p_end=p_new;
        }
        else
        {
        p_new->name=name1;
        p_new->num=num1;
        p_end->next=p_new;
        p_new->next=NULL;
        p_end=p_new;
       
       }
    }
}
void swap(){
    STUDENT *head_front ;
    head_front=(STUDENT *)malloc(sizeof(STUDENT));
    head_front->next=head;
    STUDENT *t, *p,*q,*temp;
    for(int i=0;i<sum+1;i++)
    {
        int flag = 1;
        t=head_front;
        p=t->next;
        q=p->next;
        for(int j=0;j<sum-i-1;j++)
        {
            if(p->num > q->num)
            {
                t->next = q;
                p->next = q->next;
                q->next = p;
                
                temp = p; p = q;q = temp;
               flag = 0;
                
            }
            t = t->next;
            p = t->next;
            q = p->next;
        }
        if(flag)
            break;
    }
    free(head_front);
}

void output()
{
    STUDENT *p;
    p=head;
    for(int i=0;i<sum;i++)
    {
        printf("%d %c 
",p->num, p->name);
        p=p->next;
    }
    printf("
");
}

int main()
{
    head=NULL;
    create();
    swap();
    output();
}

以上是关于冒泡排序——数组&链表的主要内容,如果未能解决你的问题,请参考以下文章

数组排序代码,冒泡排序&快速排序&选择排序

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

常用排序算法之冒泡排序选择排序

链表上的冒泡选择排序算法

链表的三种插入排序+冒泡排序

一句话解释清楚冒泡排序思想与做法