C语言 - 冒泡排序【算法优化】

版权声明:转载请注明出处 https://blog.csdn.net/qq_42292831/article/details/84639578

冒泡排序很好理解,但是如何能够让其更加有效的执行是需要我们一直思考的问题。

本文会使用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;
}

****************************************************************************************************************************************

             最快的脚步不是跨越,而是继续,最慢的步伐不是小步,而是徘徊。
 

****************************************************************************************************************************************

猜你喜欢

转载自blog.csdn.net/qq_42292831/article/details/84639578
今日推荐