一.直接插入排序(insert_sort)
直接插入排序是一种简单直观的排序算法,其基本思想是将待排序的元素逐个插入到已经排序的序列中的合适位置,从而得到一个新的有序序列。默认第一个已经排好序了,新来的元素要和前面的进行比较,找到要插入的位置,下面是C++中直接插入排序算法的实现:
#include<iostream>
#include<vector>
using namespace std;
void insert_sort(vector<int>& ans)
{
int len = ans.size();
//第一个默认已经拍好序了
for (int i = 1; i < len; i++)
{
//开始找后面插入要放的位置
int j = i - 1;//后面的数
int temp = ans[i];//新来的数
for (j; j >= 0&&temp<ans[j]; j--)
{
//比当前数小,当前数就后移
ans[j + 1] = ans[j];
}
//找到了比temp小的元素,temp插在后面
ans[j + 1] = temp;
}
}
int main()
{
vector<int>ans = { 1,4,5,2,9,4,5 };
insert_sort(ans);
for (int i = 0; i < ans.size(); i++)
{
cout << ans[i] << " ";
}
cout << endl;
system("pause");
return 0;
}
二.希尔排序(shell_sort)
希尔排序(Shell Sort)是希尔(Donald Shell)于1959年提出的一种排序算法,它是插入排序的一种改进版本。希尔排序通过将原始数据分割成若干个子序列来处理,对每个子序列进行插入排序,最后再对整体进行一次插入排序。
希尔排序的基本思想是:首先将整个待排序的数组按照一定间隔分割成若干个子数组,对每个子数组进行插入排序;然后逐步缩小间隔,重复上述操作,直至间隔为1时,进行最后一次插入排序,完成排序。
希尔排序的优点是相对于揃常见的简单排序算法,它的排序速度较快,且相对容易实现。不过,希尔排序的时间复杂度取决于增量序列的选择,不同的增量序列会导致不同的性能表现。
void shell_sort(vector<int>&ans)
{
//希尔排序就是再直接插入排序上添加了增量
int len = ans.size();
for (int h = len / 2; h > 0; h = h / 2)
{
for (int i = h; i < len; i++)
{
int temp = ans[i];
int j;
for ( j = i - h; j >= 0 && temp < ans[j]; j -= h)
{
ans[j + h] = ans[j];
}
ans[j + h] = temp;
}
}
}
三.冒泡排序 (bubble_sort)
冒泡排序(Bubble Sort)是一种简单的排序算法,它重复地走访要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。
//冒泡排序
void bubble_sort(vector<int>& ans)
{
for (int i = 0; i < ans.size() - 1; i++)
{
for (int j = 0; j < ans.size() - i - 1; j++)
{
if (ans[j] > ans[j + 1])
{
int temp = ans[j];
ans[j] = ans[j + 1];
ans[j + 1] = temp;
}
}
}
}
四.快速排序(quick_sort)
快速排序(Quick Sort)是一种常用的排序算法,它使用分治法来将一个待排数组分成两部分,其中一部分的所有元素均小于另一部分的所有元素,然后递归地对这两部分进行排序。
//快速排序
void quick_sort(vector<int>& ans,int low,int high)
{
int i, j, pivot;
if (low < high)
{
pivot = ans[low];
i = low;
j = high;
while (i < j)
{
while (i < j && ans[j] >= pivot)
{
j--;
}
if (i < j)
ans[i++] = ans[j];
while (i < j && ans[i] <= pivot)
{
i++;
}
if (i < j)
{
ans[j--] = ans[i];
}
}
ans[i] = pivot;
quick_sort(ans, low, i - 1);
quick_sort(ans, i + 1, high);
}
}
-
函数 quick_sort 接受一个整数向量 ans 和两个整数参数 low 和 high,表示要排序的部分数组的起始和结束索引。
-
在函数中,首先从待排序数组中选取第一个元素 ans[low] 作为基准值 pivot。
-
使用两个指针 i 和 j 分别指向数组的起始和结束位置。
-
在一个 while 循环中,i 从左往右移动,寻找第一个大于基准值的元素;j 从右往左移动,寻找第一个小于基准值的元素。
-
如果找到了 i < j 的情况,交换 ans[i] 和 ans[j] 的值,然后继续移动指针直到完成一次遍历。
-
最终 i 的位置被确定为基准值的位置,将基准值放置在正确的位置上。
-
接着递归调用 quick_sort 函数对基准值左右两侧的子数组进行排序。
-
当 low < high 不再成立时,说明排序完成。