C语言:冒泡排序法及其优化

  • Post author:
  • Post category:其他


冒泡排序法:

  1. 输入n个数。

  1. 在未排序的n个数中,相邻元素依次比较,数大后移,排序后最大数移到最末尾(第n项)。

  1. 在未排序的n-1个数中,相邻元素依次比较,数大后移,排序后最大数移第n-1项。

  1. 以此类推,直到未排序的数减为0,排序结束。

例如:排序前的n个数为54321

第一次排序:43215(详细过程:45321、43521、43251、43215)

第二次排序:32145

第三次排序:21345

第四次排序:12345

代码:

#include<stdio.h>
void swap(int* x, int* y)//交换函数
{
    int temp = *x;
    *x = *y;
    *y = temp;
}
void lyn(int* a, int n)//数大后移
{
    for (int j = 0; j < n - 1; j++)
        for (int i = 0; i < n - 1; i++)
            if (a[i] > a[i + 1])
                swap(&a[i], &a[i + 1]);
}
int main()
{
    int n, i;
    int a[10] = { };
    printf("输入正整数n(n<=10):");
    scanf("%d", &n);
    printf("输入%d个互不相同的整数;", n);
    for (i = 0; i < n; i++)
        scanf("%d", &a[i]);
    lyn(a, n);
    for (i = 0; i < n; i++)
        printf("%d", a[i]);
    return 0;
}

方法优化:

程序从前往后依次比较相邻元素大小的同时,也从后往前依次比较相邻元素大小

#include<stdio.h>
void swap(int* x, int* y)//交换函数
{
    int temp = *x;
    *x = *y;
    *y = temp;
}
void lyn(int* a, int n)//从前往后依次比较相邻元素大小
{
    for (int j = 0; j < n/2; j++)
        for (int i = 0; i < n - 1; i++)
            if (a[i] > a[i + 1])
                swap(&a[i], &a[i + 1]);
}
void bjt(int* a, int n)//从后往前依次比较相邻元素大小
{
    for (int j = 0; j < n/2; j++)
        for (int i = n - 2; i >= 0; i--)
            if (a[i] > a[i + 1])
                swap(&a[i], &a[i + 1]);
}
int main()
{
    int n, i;
    int a[10] = { };
    printf("输入正整数n(n<=10):");
    scanf("%d", &n);
    printf("输入%d个互不相同的整数;", n);
    for (i = 0; i < n; i++)
        scanf("%d", &a[i]);
    lyn(a, n);
    bjt(a, n);
    for (i = 0; i < n; i++)
        printf("%d", a[i]);
    return 0;
}

运行结果:



版权声明:本文为lbcbjtlhmjq原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。