三分钟搞定选择、冒泡和插入排序
选择、冒泡和插入这三种排序算法是最简单,最暴力的排序算法,掌握了这三种算法,对后面的学习将会有极大的帮助。
顺便一记,排序算法分为稳定排序算法和不稳定排序算法,他们的区别如下:
稳定排序算法:相同的两个元素,排完序后,两元素的相对位置不变
不稳定的排序算法:相同的两个元素,排完序后,两元素的相对位置可能发生变化
稳定排序的好处:比如学生的成绩单原来是按照学号排好序的,现在按照总成绩进行排序,当两个人的总成绩相等时,会按照原来的学号顺序排好
下面进入正文:
一、最简单最暴力的选择排序算法(不稳定排序)
算法思想:每一趟从待排序的数据元素中选择最小(或最大)的一个元素作为首元素,直到所有元素排完为止,排序过程如下:
代码实现:
void select_sort(vector<int>&arr)
{
int len = arr.size();
for (int i = 0;i < len;i++) //len个元素 进行len次选择
{
int index = i;
for (int j = i;j < len;j++)
{
if (arr[j] < arr[index])
index = j;
}
int temp = arr[i];
arr[i] = arr[index];
arr[index] = temp;
}
}
二、冒泡排序法(稳定排序)
算法思想:对相邻的元素进行两两比较,顺序相反则进行交换,这样,每一趟会将最小或最大的元素“浮”到顶端,最终达到完全有序,排序流程如下:
代码如下:
void Bubble_sort(vector<int>&arr)
{
int len = arr.size();
for (int i = 0;i < len;i++)
{
for (int j = 0;j <(len - i-1);j++)
{
if (arr[j + 1]<arr[j])
{
int temp = arr[j];
arr[j] = arr[j+1];
arr[j + 1] = temp;
}
}
}
}
三、直接插入排序(稳定排序)
算法思想:每一步将一个待排序的记录,插入到前面已经排好序的有序序列中去,直到插完所有元素为止。排序流程如下:
代码如下:
void Insert_sort(vector<int>&arr)
{
int len = arr.size();
for (int i = 1;i < len;i++)
{
for (int j = i;j >0;j--)
{
if (arr[j] < arr[j - 1])
{
int temp = arr[j];
arr[j] = arr[j -1];
arr[j -1] = temp;
}
}
}
}
以上三种算法的时间复杂度都为O(n^2),空间复杂度都为O(1)。