冒泡排序很好理解,但是如何能够让其更加有效的执行是需要我们一直思考的问题。
本文会使用C语言(部分C++语法)介绍冒泡排序算法并结合实际情况对齐进行优化,增强其健壮性。
****************************************************************************************************************************************
一:冒泡排序算法【初】
void Bubble_Sorted(int *array,int length) //冒泡排序算法
{
int temp;
for (int i = length-1; i>0; i--)
{
for (int j = 0; j < i; j++)
{
if (array[j] > array[j + 1])
{
temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
}
实际情况问题:
一下给出两组数据,要求使用冒泡排序对齐进行从小到大的排序:
1> 5 6 25 78 1 50 33 77 2
2> 55 5 6 25 35 62 69 88
很明显,第二组数据后面7个数据都已经是有序的,这个时候使用上面的冒泡算法便做了许多冗余的工作。
二:冒泡排序算法【优化一】
优化思路:
因为冒泡排序时双重循环,于是我们可以通过增加一个bool型变量exchange在内层循环之前;
以上面的第二组数据为例,第一次将55移到35后面,exchange由fause变为true表示被改变,
因为内层循环需要对后面的数据进行一一比较,当第一层循环进行到第二次的时候,内层循环没有进行一次交换,exchange的值不变(间接说明了后面的数据已经有序,可以直接在第一层循环后通过判断exchange的值来直接终止程序)
void Bubble_Sorted(int *array,int length)
{
int temp;
for (int i = length-1; i>0; i--)
{
bool exchange = false;
for (int j = 0; j < i; j++)
{
if (array[j] > array[j + 1])
{
temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
exchange = true;
}
}
if (!exchange) return;
}
}
三:冒泡排序算法【优化二】
再举一组数据:
4 3 2 1 5 6 7 8 9 10
使用第二种优化后的算法后,可以减少外循环的次数,但是在前面几次比较排序的过程中,后面的那些有序部分还是被用来和前方一一比较了
第三种优化主要解决这个问题:主要思想 -> 动态更改内层循环的终止条件。
void Bubble_Sorted(int *array, int length)
{
int temp;
int position = length-1;
int position_temp = length-1;
for(int i=length-1; i>0; i--)
{
bool ischanged = false;
for(int j =0; j<position; j++)
{
if(array[j]>array[j+1])
{
temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
ischanged = true;
position_temp = j;
}
}
position = position_temp;
if(!ischanged)
{
return ;
}
}
}
四:源码【测试用】
#include <bits/stdc++.h>
using namespace std;
void Bubble_Sorted(int *array, int length)
{
int temp;
int position = length-1;
int position_temp = length-1;
for(int i=length-1; i>0; i--)
{
bool ischanged = false;
for(int j =0; j<position; j++)
{
if(array[j]>array[j+1])
{
temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
ischanged = true;
position_temp = j;
}
}
position = position_temp;
if(!ischanged)
{
return ;
}
}
}
void Init_Array(int *array,int length)
{
for(int i = 0; i<length; i++)
{
(array)[i] = rand()%100;
}
}
void Traverse(int *array, int length)
{
for(int i = 0; i<length; i++)
{
cout << array[i] << endl;
}
}
int main()
{
srand(unsigned(time(NULL)));
int array[20];
int length = 20;
Init_Array(array,length);
Bubble_Sorted(array,length);
Traverse(array,length);
return 0;
}
****************************************************************************************************************************************
最快的脚步不是跨越,而是继续,最慢的步伐不是小步,而是徘徊。
****************************************************************************************************************************************