排序算法总结

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

选择排序

堆排序

归并排序

相关推荐
不去幼儿园38 分钟前
【MARL】深入理解多智能体近端策略优化(MAPPO)算法与调参
人工智能·python·算法·机器学习·强化学习
Mr_Xuhhh40 分钟前
重生之我在学环境变量
linux·运维·服务器·前端·chrome·算法
盼海2 小时前
排序算法(五)--归并排序
数据结构·算法·排序算法
网易独家音乐人Mike Zhou5 小时前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot
Swift社区9 小时前
LeetCode - #139 单词拆分
算法·leetcode·职场和发展
Kent_J_Truman9 小时前
greater<>() 、less<>()及运算符 < 重载在排序和堆中的使用
算法
IT 青年10 小时前
数据结构 (1)基本概念和术语
数据结构·算法
Dong雨10 小时前
力扣hot100-->栈/单调栈
算法·leetcode·职场和发展
SoraLuna10 小时前
「Mac玩转仓颉内测版24」基础篇4 - 浮点类型详解
开发语言·算法·macos·cangjie
liujjjiyun11 小时前
小R的随机播放顺序
数据结构·c++·算法