排序算法总结

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

选择排序

堆排序

归并排序

相关推荐
limingade3 小时前
手机实时提取SIM卡打电话的信令和声音-新的篇章(一、可行的方案探讨)
物联网·算法·智能手机·数据分析·信息与通信
jiao000015 小时前
数据结构——队列
c语言·数据结构·算法
迷迭所归处6 小时前
C++ —— 关于vector
开发语言·c++·算法
leon6257 小时前
优化算法(一)—遗传算法(Genetic Algorithm)附MATLAB程序
开发语言·算法·matlab
CV工程师小林7 小时前
【算法】BFS 系列之边权为 1 的最短路问题
数据结构·c++·算法·leetcode·宽度优先
Navigator_Z7 小时前
数据结构C //线性表(链表)ADT结构及相关函数
c语言·数据结构·算法·链表
Aic山鱼7 小时前
【如何高效学习数据结构:构建编程的坚实基石】
数据结构·学习·算法
天玑y7 小时前
算法设计与分析(背包问题
c++·经验分享·笔记·学习·算法·leetcode·蓝桥杯
sjsjs118 小时前
【数据结构-一维差分】力扣1893. 检查是否区域内所有整数都被覆盖
数据结构·算法·leetcode
redcocal8 小时前
地平线秋招
python·嵌入式硬件·算法·fpga开发·求职招聘