排序算法中最基础的三大排序算法,冒泡排序,插入排序和选择排序,按照顺序依次进行分析,参考王道考研。
冒泡排序
递增的顺序
从前往后(从后往前)两两比较相邻元素的值,若(arr[i]>arr[i+1])即较大的数在较前的位置,那么此时就需要将他们进行颠倒,知道整个序列比较结束,这一趟就叫做冒泡排序。
其中空间复杂度为O(1)
最好的情况下对比的次数是n-1次,就是原本就是有序的,时间复杂度为O(n)。
最坏的情况就是要进行n*(n-1)/2次遍历,时间复杂度为O(n²);
平均时间复杂度O(n²);
算法稳定性:稳定
代码实现:
void BubbleSort(vector<int>& arr)
{
for (int i = 0; i < arr.size()-1; i++)
{
int tmp = 0;
for (int j = 0; j < arr.size() - i - 1; j++)
{
if (arr[j] > arr[j + 1])
{
tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
插入排序
递增的顺序
每次将待排序的的数字按照大小插入到前面排好序的序列中,即向这个数字的前面遍历,将这个数字插入到前面最后一个比它大的数字之前,再开始从原来的地方继续向后遍历,直到序列遍历结束。
这里的空间复杂度也是O(1);
最好的情况也是原本就有序,对比次数是n-1次,时间复杂度就是O(n);
最坏的情况需要对比次数是n*(n-1)/2次,时间复杂度是O(n²);
算法稳定性:稳定
代码实现:
void InsertSort(vector<int>& arr)
{
for (int i = 1; i < arr.size(); i++)
{
int tmp = arr[i];
int j = i - 1;
for (; j >= 0; j--)
{
if (tmp < arr[j])
{
arr[j + 1] = arr[j];
}
else
{
break;
}
}
arr[j + 1] = tmp;
}
}
选择排序
递增的顺序
每一趟选出最大的(最小的)依次从第一个位置开始放。
空间复杂度也是O(1);
这个不管是原本有序或者无序都需要对比n*(n-1)/2次,其时间复杂度也是O(n²);
算法稳定性:不稳定
代码实现:
void SelectSort(vector<int>& arr)
{
int tmp;
for (int i = 0; i < arr.size(); i++)
{
int min = i;
int j = i;
for (; j < arr.size(); j++)
{
if (arr[min] > arr[j])
{
min = j;
}
}
if (min != i)
{
tmp = arr[i];
arr[i] = arr[min];
arr[min] = tmp;
}
}
}