目录
浅析冒泡排序
一、算法原理
对数据的处理来看,排序是必不可少的一个环节,如期末考试成绩排序,或购物商城价格排序等。今天简单聊一聊经典算法冒泡排序,冒泡排序是通过比较交换元素来实现的,是一种最基础的交换排序,之所以称为冒泡,是因为排序的过程就好像气泡上升一样,把元素逐个往数组一侧移动。
先上代码:
void bubble_sort(int arr[], int n) // 数组arr,长度n
{
for (int i = 0; i < n; i ++ )
for (int j = 1; j < n - i; j ++ )
if (arr[j-1] > arr[j]) swap(arr[j], arr[j-1]); // 比较相邻元素并交换位置
}
二、时间复杂度分析
对于给定序列,不管一开始元素是如何排列的,给含有n 个元素的数组排序总需要遍历n-1 轮,每当一个元素被移动到右侧,即排序好一个元素,剩余元素的比较次数也相应减少1轮,那么总比较次数即为(n-1)+(n-2)+…+1,很明显这是一个等差数列,首项为1,公差为1,项数为n-1,运用等差数列求和公式得Sn = (1+(n-1))*n/2。用大O表示法,取最高阶指数项,时间复杂度为O(n2)。
三、优化之短冒泡
冒泡排序作为最基础的交换排序算法,通常被认为是效率最低的排序算法,因为在确定最终的位置前,必须交换元素,但由于冒泡排序会对未排序元素进行完全遍历,它也具有其他排序算法没有的用途,那就是在应对部分有序的序列时,可以通过优化代码,大大提高运行速度,这就是所谓的短冒泡。
短冒泡通过元素交互与否来判断待排序元素是否已经有序,若已经有序则不再进行比较,代码如下:
void bubble_sort(int arr[], int n) // 数组arr,长度n
{
bool exchange = true;
while (n - 1 > 0 && exchange)
{
exchange = false;
for (int i = 0; i < n; i ++ )
for (int j = 1; j < n - i; j ++ )
if (arr[j-1] > arr[j])
{
swap(arr[j], arr[j-1]);
exchange = true; // 发生了交换
}
}
}
冒泡排序到此告一段落,你学费了吗?