冒泡排序示例

目录

一、冒泡排序核心

二、冒泡排序可执行C程序

三、冒泡排序结果及解析


更正错误2019.12.08

一、冒泡排序核心

void bubble_sort(int* src,int length)  //整数数组的排序
{
    int i = 0,j = 0;
    int tmp = 0;

    /* 入参检查 */
    if(NULL == src || length <= 0)
    {
        printf("[Error]:Func:%s input is invaild!",__FUNCTION__);
        return;
    }


  /* 冒泡排序核心算法 */
  for(i=0;i<length - 1;i++)    //外层负责趟数,一趟处理一个数(把一个大数往后挪)
  {
    for(j=0;j<length-1-i;j++)  //内层负责每次把大数往后挪,后侧排序后的数据不再处理
                               //(注意循环次数取值)
    {
      if(src[j] > src[j+1])      //将大的数往后挪
      {
        tmp = src[j];
        src[j] = src[j+1];
        src[j+1] = tmp;
      }
    }
  }
    
}

二、冒泡排序可执行C程序

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int **bbule_point = NULL;
 
/* 冒泡排序子函数 */
int bbule_sort(int* src,int length)
{
  int i=0;
  int j=0;
  int tmp=0;
  int record_err = 0;
  int* record_point = NULL;
 
  if(NULL == src || 0 >= length)
  {
      printf("Func:%s Input Err:src=%d length=%d\n\r",__FUNCTION__,(int)src,length);
      return -1;
  }
 
  /* 申请存放每次排序结果的数组的指针的数组空间 */
  bbule_point = (int**)malloc(length*sizeof(int*));
  if(NULL == bbule_sort)
  {
    printf("Func:%s Record Err,Malloc Failed!\n\r",__FUNCTION__);
    record_err = 1;
  }
  memset(bbule_point,0,sizeof(int*)*length);
  record_point = malloc(length*sizeof(int));
  if(NULL == record_point)
  {
    printf("Func:%s Record Err,Malloc Failed!\n\r",__FUNCTION__);
  }
  else
  {
    memcpy(record_point,src,sizeof(int)*length);
    bbule_point[0] = record_point;
  }
 
  /* 冒泡排序核心算法 */
  for(i=0;i<length - 1;i++)    //外层负责趟数,一趟处理一个数(把一个大数往后挪)
  {
    for(j=0;j<length-1-i;j++)  //内层负责每次把大数往后挪,后侧排序后的数据不再处理
    {
      if(src[j]>src[j+1])      //将大的数往后挪
      {
        tmp = src[j];
        src[j] = src[j+1];
        src[j+1] = tmp;
      }
    }
    /* 一趟排序完成,记录一下 */
    if(!record_err)
    {
      record_point = (int*)malloc(sizeof(int)*length);
      if(NULL == record_point)
      {
        printf("Func:%s Record Err,Malloc Failed!\n\r",__FUNCTION__);
        continue;
      }
      memcpy(record_point,src,sizeof(int)*length);
      bbule_point[i+1]=record_point;
    }
  }
 
  return 0;
}
 
void printf_str(int *src,int length)
{
  int i=0;
 
  if(NULL == src || 0 == length)
  {
    printf("Func:%s Input Err:src=%d length=%d\n\r",__FUNCTION__,(int)src,length);
    return ;
  }
 
  printf("数组元素:");
  for(i=0;i<length;i++)
  {
    printf("   %2d",src[i]);
  }
  printf("\n\r");
}
 
int main()
{
  int src[]={92,80,77,72,64,53,42,30,29,21,12,2};
  int i=0;
 
  printf("******冒泡排序算法示例******\n初始");
  printf_str(src,sizeof(src)/sizeof(int));
  printf("共有%d个元素,开始排序\n",sizeof(src)/sizeof(int));
  bbule_sort(src,sizeof(src)/sizeof(int));
  printf("排序后");
  printf_str(src,sizeof(src)/sizeof(int));
  if(NULL == bbule_point)
  {
    printf("Err while Record Data!\n");
    return -1;
  }
  printf("排序过程详解:\n");
  printf("*原始数组*:");
  printf_str(bbule_point[0],sizeof(src)/sizeof(int));
  for(i=1;i < sizeof(src)/sizeof(int);i++)
  {
      printf("第%-2d次排序:",i);
      printf_str(bbule_point[i],sizeof(src)/sizeof(int));
      free(bbule_point[i]);
  }
 
  return 0;
}

三、冒泡排序结果及解析

3.1、第一组数据:完全降序的数组,将其排序为完全升序的数组

排序过程:将大数逐一往后挪

3.2、第二组数据:将乱序的数组排序为升序的数组

排序过程:将大数逐一往后挪,逐一乱序时,冒泡是逐步挪动数据的,一次挪动的不止一个数据,原因:每次排序都只判断当前位置最新数据和后一个数据的大小,并不是先找出最大的数据然后再移动最大的数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值