1、冒泡排序定义
冒泡排序属于交换排序,其基本思路为:两两比较相邻的数据大小并按照需求交换顺序,知道不存在反序为止。最快:已经是一正序数列;最慢:已经为一全反序数列。时间复杂度为:n~n^2间。【非标准冒泡,标准冒泡,冒泡优化】
2、非标准冒泡
对于一个数列,非标准冒泡就是一种交换算法,即是不太严格准从两两相邻比较这一规则,而是例如【7,3,4,9,1】固定一个分别与剩下的数值比较,取得最小或最大,然后开始下一轮。
【7,3,4,9,1】》【3,7,4,9,1】》【1,7,4,9,3】
3、标准冒泡
通过两两比较使得小的上升效果,具体为:【7,3,4,9,1】》【7,3,4,1,9】》【7,3,1,4,9】》【7,1,3,4,9】》【1,7,3,4,9】,同理后面则是同样重复此过程,而1重最后变为最前就如一个气泡在水中上浮的过程。
4、冒泡优化
但是标准冒泡还是又缺点,缺点就是对于如这样的数列排序【2,1,3,4,5】对于【3,4,5】这样的正序部分在进行冒泡就有点没有意义了。因此需要改进,对于这样的之关系前面的【2,1】即可。
具体代码
/*
作者:kimicr
时间:20200327
功能:冒泡排序算法
特点:稳定且时间复杂度【n~ n^2】
*/
#include"iostream"
using namespace std;
void SWAP(int *array, int i, int j)
{
int temp;
temp = array[i];
array[i] = array[j];
array[j] = temp;
}
//非标准冒泡
void BubbleSort1(int *array, int length) //数组名与长度
{
if (length <= 1) return;
for (int i = 0; i < length-1; i++)
{
for (int j = i + 1; j < length; j++)
{
if (array[j] < array[i])
SWAP(array, i, j);
}
}
}
//标准冒泡
void BubbleSort2(int *array, int length)
{
if (length <= 1) return;
for (int i = 0; i < length; i++)
{
for (int j = length - 1; j>=i; j--)
{
if (array[j] < array[j - 1])
SWAP(array, j, j - 1);
}
}
}
//冒泡优化
void BubbleSort3(int *array, int length)
{
if (length <= 1) return;
bool flage = true;
for (int i = 0; i < length && flage; i++)
{
flage = false;
for (int j = length - 1; j >= i; j--)
{
if (array[j] < array[j - 1])
SWAP(array, j, j - 1);
}
}
}
int main()
{
//int a[10] ={2,1,3,4,5,6,7,8,9};
int a[10] = { 9, 1, 5, 8, 3, 7, 4, 6, 2 };
BubbleSort1(a, 10);
//BubbleSort2(a,10);
//BubbleSort3(a,10);
for (int i = 0; i < 10; i++)
cout << a[i] << " ";
cout << endl;
system("pause");
return 0;
}