排序算法总结

排序方法 最好 平均 最坏 空间复杂度 稳定性
冒泡排序 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(清华大学出版社,严蔚敏)*/

选择排序

堆排序

归并排序

相关推荐
WWZZ202531 分钟前
ORB_SLAM2原理及代码解析:SetPose() 函数
人工智能·opencv·算法·计算机视觉·机器人·自动驾驶
小马学嵌入式~1 小时前
堆排序原理与实现详解
开发语言·数据结构·学习·算法
青岛少儿编程-王老师1 小时前
CCF编程能力等级认证GESP—C++6级—20250927
java·c++·算法
一人の梅雨1 小时前
1688 拍立淘接口深度开发:从图像识别到供应链匹配的技术实现
人工智能·算法·计算机视觉
Miraitowa_cheems2 小时前
LeetCode算法日记 - Day 64: 岛屿的最大面积、被围绕的区域
java·算法·leetcode·决策树·职场和发展·深度优先·推荐算法
Christo32 小时前
关于K-means和FCM的凸性问题讨论
人工智能·算法·机器学习·数据挖掘·kmeans
_不会dp不改名_3 小时前
leetcode_1382 将二叉搜索树变平衡树
算法·leetcode·职场和发展
greentea_20133 小时前
Codeforces Round 173 B. Digits(2043)
c++·算法
m0_743106464 小时前
LOBE-GS:分块&致密化效率提升
人工智能·算法·计算机视觉·3d·几何学
徐子童4 小时前
优选算法---字符串
java·算法·字符串·笔试·高精度相乘