排序算法一——冒泡排序 - Go语言中文社区

排序算法一——冒泡排序


排序算法一:冒泡排序

最简单,最常用的排序方法之一。冒泡排序是稳定的,相同的值的相对位置在排序后没有改变。时间复杂度O(n^2)。
冒泡排序的代码及其改进版:

/*****************************************************
     File name:1bubble.c

 Author: Tang Zhiqian

  Date:2017-08-07 17:07
*****************************************************/

#include <stdio.h>

#define MAX 10

typedef int ElemenType;
typedef ElemenType ARR[MAX];    //给数组另起名字
int len = sizeof(ARR)/sizeof(ElemenType);    //数组长度

void swap(ElemenType arr[],int i,int j);    //交换函数
void print(ARR arr);    //打印
void bubble1(ARR arr);    //未改进的冒泡排序
void bubble2(ARR arr);    //改进后的冒泡排序

int main()
{
    ARR arr1 = {9,0,1,2,3,4,5,6,7,8};
    ARR arr2 = {9,0,1,2,3,4,5,6,7,8};

    printf("\n未改进的冒泡排序:\n");
    bubble1(arr1);

    printf("\n");

    printf("改进后的冒泡排序:\n");
    bubble2(arr2);


    return 0;
}

void bubble1(ARR arr)
{
    int i,j;

    for (i = 0; i < len - 1; i++)
    {
        for (j = 0; j < len - i - 1; j++)
        {
            if (arr[j] > arr[j + 1])
            {
                swap(arr,j,j+1);
            }
        }
        print(arr);
    }
}

void bubble2(ARR arr)
{
    int i,j;
    int flag = 1;

    for (i = 0; i < len - 1; i++)
    {
        flag = 0;
        for (j = 0; j < len - i - 1; j++)
        {
            if (arr[j] > arr[j + 1])    
            {
                flag = 1;     //进入这个判断,flag = 1;
                swap(arr,j,j+1);
            }
        } 
        if (flag == 0)    //如果flag等于零,说明上一次循环没有交换位置,说明排序已经完成,则break
        {
            break;
        }
        print(arr);
    }
}


void  print(ARR arr)
{
    int i;
    for (i = 0; i < len; i++)
    {
        printf("%d ",arr[i]);
    }
    printf("\n");
}

void swap(ElemenType arr[],int i,int j)
{
    ElemenType temp;
    temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

程序运行结果:
这里写图片描述

在这里我们看到,未改进的bubble1排序,输出了9行排好序的数,而改进过的bubble2只输出了一行。未排序前的数字顺序为{9,0,1,2,3,4,5,6,7,8},观察发现,其实经过一轮冒泡之后,这个数组就已经排好序了,但是程序不知道是否排好序,所以会一直循环完。 但是在bubble2中我添加了一个flag,进入第一个for循环就让flag=0,第二级for循环中if判断下flag= 1,假设二级for循环一圈后都没有进入到if里面,则flag = 0,说明这时候数组已经排好序了,因为它一轮比较之后都没有进入if里面执行swap函数。这样下来电脑就少执行了很多次 比较 的过程。

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/TAaron666/article/details/76863107
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2023-01-03 20:19:16
  • 阅读 ( 446 )
  • 分类:算法

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢