C++实现十大排序算法_liuzuoping的博客-CSDN博客_c++最快的排序算法
C/C++ 排序&&查找算法(面试) - 星语海蓝 - 博客园
C++ 几种常用排序算法讲解_DreamerZhang的专栏-CSDN博客_c++排序算法
-
排序
堆排序、快速排序、希尔排序、选择排序是不稳定的排序算法,
而基数排序、冒泡排序、直接插入排序、折半插入排序、归并排序是稳定的排序算法。
https://blog.csdn.net/qq_43671438/article/details/123411763
1. 冒泡排序 ***
- 从左到右比较任意相邻的两个数字,如果第一个比第二个大,就交换;
- 对每一组相邻元素都做相同的工作,此时最后一个元素会是最大的元素;
- 重复上述步骤,除了最后一个;
- 持续重复,直到没有元素需要比较。
从左到右和从右到左都可以。比大比小都可以。
// 冒泡排序
void BubbleSort(vector<int>& vec)
{
int len = vec.size();
bool y = false; //标记此次排序是否有序
for(int i = 0; i < len-1 && !y ;i++)
{
y = true;
for(int j = 0;j < len-1-i;j++)
{
if(vec[j] > vec[j+1])
{
y = false; //一次排序中发生一次交换就为无序
swap(v[j],v[j+1]);
}
}
}
}
2. 选择排序
- 首先找到数组中最小的元素,让他和数组第一个元素交换位置;
- 然后在剩余元素中找最小的元素,让他和第二个元素交换位置;
- 循环,直至数组排序完成。 最大最小都可以。
//选择排序
void SelectionSort(vector<int>& vec)
{
int min, len = vec.size();
for(int i = 0;i < len-1;i++)
{
min = i; //初始时假设第一个是最小的
for(int j = i+1; j < len ;j++)
{ //找出最小的
if(vec[j] < vec[min])
{
min = j;
}
}
if(i != min) //将此时的最小元素放在i
swap(vec[i],vec[min]);
}
}
3. 插入排序
- 从第一个元素开始,将此元素认为已排序;
- 取出第二个元素temp,与前面 已排序序列 从后向前扫描;
- 如果扫描到的元素比temp大,就继续向前扫描;
- 重复3,直到找到比temp小或者等于temp的元素;
- 将temp插入该位置;
- 重复2——5步骤;
// 插入排序
void InsertSort(vector<int>& vec)
{
int len = vec.size();
for(int i = 1;i < len;i++)
{
int temp = v[i]; //存储当前元素
for(int j = i-1; j >= 0;j--)
{ //前面已排序的序列
if(v[j] > temp) //交换位置
{
v[j+1] = v[j];
v[j] = temp;
}
else
break;
}
}
}
4. 希尔排序
缩小增量排序,每一轮按照事先决定的间隔进行插入排序,间隔会依次缩小,最后一次一定要是1。
希尔排序C++实现_zpznba的博客-CSDN博客_希尔排序c++
void ShellSort(int a[] , int length)
{
int gap = length/3 + 1;
while(gap >= 1)
{
for(int i = gap;i < length;i++)
{
for(int j = i;j >= gap &&a[j] <a[j-gap];j -= gap)
{
swap(a[j] , a[j-gap]);
}
}
gap = gap / 3;
}
}
5. 归并排序 ******
C++ 归并排序与快速排序_zpznba的博客-CSDN博客_c++归并排序
归并排序的迭代实现_zpznba的博客-CSDN博客_归并排序 迭代
分冶;
把数据分为两段,从两段中逐个选最小的元素移入新数据段的末尾。可从上到下或从下到上进行。
6. 快速排序 *****
分冶法;
- 选取第一个数作为基准;
- 将比基准数小的交换到前面,比基准数大的放在后面;
- 对左右区间重复第二步,直到各个区间只有一个数。
快速排序算法——C/C++_有人_295的博客-CSDN博客_c++快速排序
快排的最坏情况_HelloWorld_EE的博客-CSDN博客_快排最坏的情况
如果选择基准数是最大值或者最小值的情况下,是最坏情况。n2
// 合并到一起快速排序
void QuickSort(int array[], int low, int high) {
if (low < high) {
int first = low;
int last = high;
int key = array[i]; //第一个设为基准
while (first < last) {
while (first < last && array[last] >= key) {
last--;
}
if (first < last) {
array[first] = array[last];
}
while (first < last && array[first] <= key) {
first++;
}
if (first < last) {
array[last] = array[first];
}
}
array[first] = key; //基准位置
QuickSort(array, low, first - 1); //前半递归
QuickSort(array, first + 1, high); //后半递归
}
}
7. 堆排序 ******* nlogN
堆的构建, 以及堆排序的c++实现_pursue_my_life的博客-CSDN博客_堆排序c++实现