数据结构与算法(13)冒泡排序

冒泡排序的原理

将临近元素依次进行比较,如果顺序不符合要求就调整到正确的顺序。如有n个元素就进行 n - 1趟这样的比较,每趟比较可以将一个最值元素位置确定下来,这样的排序算法称为冒泡排序

这里写图片描述

测试代码

/*
冒泡排序算法
时间复杂度为O(n^2)
*/
#include <stdio.h>
#include <stdlib.h>

#pragma warning(disable: 4996)

#define LIST_MAX_SIZE 20

#define OK 1
#define ERROR 0

#define TRUE 1
#define FALSE 0

typedef int Status;
typedef char DataType[10];
typedef int KeyType;

typedef struct{
    KeyType key;
    DataType data;
}Node;

typedef Node List[LIST_MAX_SIZE];

Status Swap(Node *L1, Node *L2)
{
    Node temp;
    temp = *L1;
    *L1 = *L2;
    *L2 = temp;

    return OK;
}

/*
按递增的顺序,冒泡排序
*/
Status BubbleSort_1(List L, int n)
{
    int i, j;
    for (i = 0; i < n - 1; ++i){        //需要检查n - 1次,将n - 1个元素进行归位
        for (j = 0; j < n - 1 - i; ++j){//每次归位的是最后一个元素,减而治之剩下的元素
            if (L[j].key > L[j + 1].key){
                Swap(&L[j], &L[j + 1]);
            }
        }
    }
    return OK;
}

/*
按照递减的顺序进行冒泡排序
*/
Status BubbleSort_2(List L, int n)
{
    int i, j;
    for (i = 0; i < n - 1; ++i){
        for (j = 0; j < n - 1 - j; ++j){
            if (L[j].key < L[j + 1].key){
                Swap(&L[j], &L[j + 1]);
            }
        }
    }

    return OK;
}
/*
可以将排好序的元素放置在左侧位置
*/
Status BubbleSort_3(List L, int n)
{
    int i, j;
    for (i = 0; i < n - 1; ++i){
        for (j = i; j < n - 1; ++j){
            if (L[j].key < L[j + 1].key){
                Swap(&L[j], &L[j + 1]);
            }
        }
    }

    return OK;
}
int main()
{
    List L;
    int n, i;
    KeyType a[] = { 12, 32, 43, 124, 454, 23, 12, 45, 565 };
    n = sizeof(a) / sizeof(a[0]);
    for (i = 0; i < n; ++i){
        L[i].key = a[i];
    }

    BubbleSort_1(L, n);
    printf("递增顺序为: \n");
    for (i = 0; i < n; ++i){
        printf("%d ", L[i].key);
    }
    printf("\n");

    BubbleSort_3(L, n);
    printf("递减顺序为: \n");
    for (i = 0; i < n; ++i){
        printf("%d ", L[i].key);
    }
    printf("\n");

    system("pause");
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值