数据结构与算法之排序(更新中。。。)
冒泡排序
代码分析:
这段代码实现了冒泡排序算法,其时间复杂度为 O ( n 2 ) O(n^2) O(n2)。冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复地进行直到没有再需要交换的元素,也就是说该数列已经排序完成。
在这段代码中,bubbleSort函数中的外层循环执行了n次,内层循环执行了n-1次,因此总的时间复杂度为 O ( n 2 ) O(n^2) O(n2)。虽然冒泡排序的时间复杂度较高,但是它实现简单,对于小规模的数据排序效果还是不错的。
代码解读:
这段代码实现了冒泡排序算法。冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复地进行直到没有再需要交换的元素,也就是说该数列已经排序完成。
在这段代码中,swap函数实现了两个元素的交换,bubble函数实现了一次冒泡排序,bubbleSort函数则是对整个数组进行冒泡排序。其中,bubble函数返回一个布尔值,表示是否进行了交换操作,如果没有进行交换操作,说明数组已经排好序了,可以直接退出循环。
在main函数中,首先输出了原始数组,然后调用bubbleSort函数对数组进行排序,最后输出排序后的数组。可以看到,排序后的数组是按照从小到大的顺序排列的。
值得注意的是,这段代码中使用了模板类,可以对不同类型的数组进行排序。同时,使用了STL中的foreach函数,可以方便地对数组进行遍历输出。
#include <iostream>
#include <algorithm>
template<class T>
void swap (T& a, T& b)
{
T temp = a;
a = b;
b = temp;
}
template<class T>
bool bubble (T a[], int n)
{
bool swapped = false;
for (int i = 0; i < n - 1; ++i)
{
if (a[i] > a[i+1])//如果数组已经是排序的话,则排序就终止了
{
swap(a[i], a[i+1]);
swapped = true;
}
}
return swapped;
}
template<class T>
void bubbleSort(T a[], int n)
{
for (int i = n; i > 1 && bubble(a, i); --i); //最后只剩一个数字就是排好序的,故到a>1即可
}
void Show(const int& v)
{
std::cout << v << " ";
}
int main()
{
int arr[]{ 6, 5, 8, 4, 3, 1 };
for (auto x : arr)
std::cout << x << " ";
//std::for_each(arr, arr + sizeof(arr) / sizeof(int), Show);
std::cout << "\n";
bubbleSort(arr, sizeof(arr) / sizeof(int));
std::for_each(arr, arr + sizeof(arr) / sizeof(int), Show);
std::cout << std::endl;
return 0;
}