排序算法总结

排序方法 最好 平均 最坏 空间复杂度 稳定性
冒泡排序 O(n) O(n^2) O(n^2) O(1) 稳定
直接插入排序 O(n) O(n^2) O(n^2) O(1) 稳定
选择排序 O(n^2) O(n^2) O(n^2) O(1) 不稳定
希尔排序 O(n^1.3) O(n^1.5) O(1) 不稳定
堆排序 O(n * log(n)) O(n * log(n)) O(n * log(n)) O(1) 不稳定
快速排序 O(n * log(n)) O(n * log(n)) O(n^2) O(log(n)) ~ O(n) 不稳定
归并排序 O(n * log(n)) O(n * log(n)) O(n * log(n)) O(n) 稳定

快速排序

设要排序的数组是 A [ 0 ] ... ... A [ N − 1 ] A[0]......A[N-1] A[0]......A[N−1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它左边,所有比它大的数都放到它右边,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。

步骤:

  1. 设置两个变量 i 、 j i、j i、j,排序开始的时候: i = 0 , j = N − 1 i=0,j=N-1 i=0,j=N−1;
  2. 以第一个数组元素作为关键数据,赋值给 k e y key key,即 k e y = A [ 0 ] key=A[0] key=A[0];
  3. 从 j j j开始向前搜索,即由后开始向前搜索 ( j − − ) (j--) (j−−),找到第一个小于 k e y key key的值 A [ j ] A[j] A[j],将 A [ j ] A[j] A[j]和 A [ i ] A[i] A[i]的值交换;
  4. 从 i i i开始向后搜索,即由前开始向后搜索 ( i + + ) (i++) (i++),找到第一个大于 k e y key key的 A [ i ] A[i] A[i],将 A [ i ] A[i] A[i]和 A [ j ] A[j] A[j]的值交换;
  5. 重复第3、4步,直到 i = = j i==j i==j;(3,4步中,没找到符合条件的值,即3中 A [ j ] A[j] A[j]不小于 k e y key key,4中 A [ i ] A[i] A[i]不大于 k e y key key的时候改变 j 、 i j、i j、i的值,使得 j = j − 1 , i = i + 1 j=j-1,i=i+1 j=j−1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候 i , j i, j i,j指针位置不变。另外, i = = j i==j i==j这一过程一定正好是 i + i+ i+或 j − j- j−完成的时候,此时令循环结束)。

C++实现

复制代码
#include <iostream>
 
using namespace std;
 
void Qsort(int arr[], int low, int high){
    if (high <= low) return;
    int i = low;
    int j = high;
    int key = arr[low];
    while (true)
    {
        /*从左向右找比key大的值*/
        while (arr[i] <= key)
        {
            i++;
            if (i == high){
                break;
            }
        }
        /*从右向左找比key小的值*/
        while (arr[j] >= key)
        {
            j--;
            if (j == low){
                break;
            }
        }
        if (i >= j) break;
        /*交换i,j对应的值*/
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
    /*中枢值与j对应值交换*/
    arr[low] = arr[j];
    arr[j] = key;
    Qsort(arr, low, j - 1);
    Qsort(arr, j + 1, high);
}
 
int main()
{
    int a[] = {57, 68, 59, 52, 72, 28, 96, 33, 24};
 
    Qsort(a, 0, sizeof(a) / sizeof(a[0]) - 1);/*这里原文第三个参数要减1否则内存越界*/
 
    for(int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
        {
        cout << a[i] << " ";
    }
     
    return 0;
}/*参考数据结构p274(清华大学出版社,严蔚敏)*/

选择排序

堆排序

归并排序

相关推荐
七牛云行业应用15 小时前
深度解析强化学习(RL):原理、算法与金融应用
人工智能·算法·金融
和编程干到底15 小时前
数据结构 栈和队列、树
数据结构·算法
纪元A梦16 小时前
贪心算法在GNN邻域采样问题中的深度解析
算法·贪心算法
宇钶宇夕16 小时前
西门子 S7-200 SMART PLC 核心指令详解:从移位、上升沿和比较指令到流水灯控制程序实战
运维·算法·自动化
爱编程的化学家16 小时前
代码随想录算法训练营第十一天--二叉树2 || 226.翻转二叉树 / 101.对称二叉树 / 104.二叉树的最大深度 / 111.二叉树的最小深度
数据结构·c++·算法·leetcode·二叉树·代码随想录
tqs_1234516 小时前
redis zset 处理大规模数据分页
java·算法·哈希算法
吃着火锅x唱着歌17 小时前
LeetCode 1446.连续字符
算法·leetcode·职场和发展
愚润求学17 小时前
【贪心算法】day10
c++·算法·leetcode·贪心算法
吴秋霖17 小时前
主流反爬虫、反作弊防护与风控对抗手段
爬虫·算法·反爬虫技术
java1234_小锋18 小时前
Scikit-learn Python机器学习 - 分类算法 - K-近邻(KNN)算法
python·算法·机器学习