冒泡排序、选择排序、归并排序、

C++实现十大排序算法_liuzuoping的博客-CSDN博客_c++最快的排序算法

C/C++ 排序&&查找算法(面试) - 星语海蓝 - 博客园

C++ 几种常用排序算法讲解_DreamerZhang的专栏-CSDN博客_c++排序算法

 

  • 排序

堆排序、快速排序、希尔排序、选择排序是不稳定的排序算法, 

而基数排序、冒泡排序、直接插入排序、折半插入排序、归并排序是稳定的排序算法。

https://blog.csdn.net/qq_43671438/article/details/123411763

1. 冒泡排序   ***

  1. 从左到右比较任意相邻的两个数字,如果第一个比第二个,就交换;
  2. 对每一组相邻元素都做相同的工作,此时最后一个元素会是最大的元素;
  3. 重复上述步骤,除了最后一个;
  4. 持续重复,直到没有元素需要比较。

从左到右和从右到左都可以。比大比小都可以。

// 冒泡排序
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. 选择排序

  1. 首先找到数组中最小的元素,让他和数组第一个元素交换位置;
  2. 然后在剩余元素中找最小的元素,让他和第二个元素交换位置;
  3. 循环,直至数组排序完成。  最大最小都可以。
//选择排序
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.  插入排序

  1. 从第一个元素开始,将此元素认为已排序;
  2. 取出第二个元素temp,与前面 已排序序列 从后向前扫描;
  3. 如果扫描到的元素比temp大,就继续向前扫描;
  4. 重复3,直到找到比temp小或者等于temp的元素;
  5. 将temp插入该位置;
  6. 重复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. 快速排序 *****

分冶法;

  1. 选取第一个数作为基准
  2. 将比基准数小的交换到前面,比基准数大的放在后面;
  3. 对左右区间重复第二步,直到各个区间只有一个数。

快速排序算法——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++实现

堆排序 + Top K 问题_把知识CV进脑子的博客-CSDN博客

  • 堆排序和快排的平均复杂度和最坏时间复杂度

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值