环境:VS2017 C language
在冒泡排序法三部曲の一冒泡排序法的原理之后,其实存在一些可优化的问题,首先就是假如是{1,2,3,6,4}这样的数组,经过一次冒泡之后数组变为{1,2,3,4,6}就已经是有序数列,可是编码中并不会识别,所以本次加入了一个数组顺序变换标识符,在每小轮变换前将标识符置一,在本小轮变换过程中如果发生了数组交换就将标识符置零。每小轮变换完成后判断标识符,如果标识符为1即表明数组顺序未发生变化,则直接break跳出主循环。
.h文件
#ifndef BUBBLE_H_
#define BUBBLE_H_
void improve(int *array, int number)
{
int temp; //中间数据缓存器
int times = 0;
for (int i = 0; i < number - 1; i++,times++) //外部循环
{
//标记转换
int translate = 1;
for (int i = 0; i < number - 1; i++)
{
if (array[i] > array[i + 1])
{
temp = array[i];
array[i] = array[i + 1];
array[i + 1] = temp;
translate = 1;
}
}
if (translate == 0)
{
break; //结束所有循环
}
}
printf("The time of sort is :%d\n", times);
return array;
}
#endif
主函数main.c
#include<stdio.h>
#include"bubble.h"
int main()
{
int array[] = { 1,2,3,4,5,5,7,6,10,9,8 };
int m = sizeof(array) / sizeof(int);
printf("The primary array is\n");
for (int i = 0; i < m; i++)
printf("%d\t", array[i]);
printf("\n"); //此处加个换行,用于显示优化后的排序算法内部进行的次数
improve(array, m);
printf("After sorted,the sequence is:\n");
for (int i = 0; i < m; i++)
printf("%d\t", array[i]);
return 0;
}
运行结果
可以看到,与原理版中共进行10*10=100次比较过程想必,本结构只需要进行10次比较,效率提升了9倍。其实这也不是最终版,程序还可以进一步优化,这将在冒泡排序最终版中说明。