排序算法一——冒泡排序

排序算法一:冒泡排序

最简单,最常用的排序方法之一。冒泡排序是稳定的,相同的值的相对位置在排序后没有改变。时间复杂度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函数。这样下来电脑就少执行了很多次 比较 的过程。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值