算法即内功
排序
1.排序是什么
排序简单来说就是以升序或者是降序来排列数据的算法。
2.为什么要排序
排序是计算机科学中非常重要的的一类算法,排序可以显著地降低问题的复杂性。比如查找。
3.排序的分类
- 基于比较次数
- 基于交换次数
- 基于空间复杂度
- 基于递归
- 基于稳定性
这些基本概念我也好模糊,通过后面一步步的学习应该会越来越清楚的。
冒泡排序
冒泡排序是最简单的一种排序算法。它从输入数组的第一个元素开始迭代到最后一个元素。比较相邻的两个元素,在需要的时候进行交换。持续进行这样的迭代直到整个数组的元素是有序的。因为每次迭代会找到一个最大或者最小的元素把他放在数组开始或者结尾,故称之为冒泡排序。
实现:
void bubbleSort(int a[],int n)
{
for(int i=0;i<n-1;i++){//迭代n-1次
for(int j=0;j<n-1-i;j++){//每次比较已经冒泡以外的数
if(a[i]>a[i+1]){
int temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;//交换元素
}
}
}
}
根据代买我们可以看出算法的时间开销为O(n^2)。这是相当的大了,所以基本不推荐使用。但是因为很简单,在数据量很小的时候也可以用。我们也可以对冒泡排序进行优化。这样可以在上一次迭代如果已经没有交换发生说明数组已经有序,后面的迭代我们就可以不进行了。这样可以进行一定的优化。
void bubbleSort(int a[],int n)
{
for(int i=0;i<n-1;i++)//迭代n-1次{
int swapped;
for(int j=0;j<n-1-i&&swapped;j++){//每次比较已经冒泡以外的数
swapped=0;
if(a[i]>a[i+1]){
int temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;//交换元素
swapped=1;
}
}
}
}
进行优化后的代码在最好情况下的时间复杂度为O(n)。
所以进行优化后最后情况的复杂度还是O(n),所以一般不推荐使用冒泡排序。