一 描述
在无序的数组中,在一趟排列中,从后向前,两两比较,小的往前排,大的往后放,那么一趟排列下来第一个总是排列中最小的,而大的依次向后冒;
二 代码
/*************************************************
Function: BubbleSoft
Description: 普通冒泡排序
Input;
k:待排序的数组 length:数组的长度
Output: 无
Return: 无
Others: 无
*************************************************/
void BubbleSoft(int k[], int length)
{
int count1 = 0;//比较次数
int count2 = 0;//交换次数
for (int i = 0; i < length; ++i)
{
for (int j = length - 1; j>i;--j)
{
count1++;
if (k[j] < k[j-1])
{
Swap(k,j,j-1);
count2++;
}
}
}
std::cout << std::endl << "普通冒泡排序共比较:" << count1 << " 共交换:" << count2 << std::endl;
}
主函数代码;
void Display(int k[])
{
for (int i = 0; i < 10; ++i)
{
std::cout << k[i] << ' ';
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int k[10] = { 5, 1, 6, 4, 3, 9, 0, 7, 2, 8 };
std::cout << "排序前" << std::endl;
Display(k);
BubbleSoft(k, 10);
std::cout << "排序后" << std::endl;
Display(k);
getchar();
return 0;
}
结果
排序前
5 1 6 4 3 9 0 7 2 8
普通冒泡排序共比较:45 共交换:20
排序后
0 1 2 3 4 5 6 7 8 9
5 1 6 4 3 9 0 7 2 8
普通冒泡排序共比较:45 共交换:20
排序后
0 1 2 3 4 5 6 7 8 9
三 优化
在程序排序没有进行交换时候,就没必要在进行排序,也就意味着排序已经完成,在程序里面增加哨兵
优化代码如下:
void BubbleSoft1(int k[], int length)
{
int flag=1;
int count1 = 0;//比较次数
int count2 = 0;//交换次数
for (int i = 0; flag==1 && i < length; ++i)
{
for (int j = length - 1; j>i; --j)
{
flag = 0;
count1++;
if (k[j] < k[j - 1])
{
Swap(k, j, j - 1);
count2++;
flag = 1;
}
}
}
std::cout << std::endl << "优化后冒泡排序共比较:" << count1 << " 共交换:" << count2 << std::endl;
}
打印结果如下:5 1 6 4 3 9 0 7 2 8
优化后冒泡排序共比较:39 共交换:20
排序后
0 1 2 3 4 5 6 7 8 9
比较结果右45变为了39