目录
更正错误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、第二组数据:将乱序的数组排序为升序的数组
排序过程:将大数逐一往后挪,逐一乱序时,冒泡是逐步挪动数据的,一次挪动的不止一个数据,原因:每次排序都只判断当前位置最新数据和后一个数据的大小,并不是先找出最大的数据然后再移动最大的数据。