各种排序的实现与复杂度分析(持续更新)

稳定性:

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

冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。

复杂度

冒泡法:  复杂度为O(n*n)。当数据为正序,将不会有交换。复杂度为O(0)。不说了。

直接插入排序:O(n*n)

希尔排序:算法的复杂度为n的1.2次幂

选择排序:O(n*n)

快速排序:不稳定,平均时间复杂度O(nlogn),最坏情况时间复杂度为O(n2)。所有内部排序方法中最高好的,大多数情况下总是最好的。空间复杂度主要是递归造成的栈空间的使用,最好情况,递归树的深度为log2n,其空间复杂度也就为O(logn),最坏情况,需要进行n‐1递归调用,其空间复杂度为O(n),平均情况,空间复杂度也为O(logn)

归并排序:log2(n)*n

堆排序:log2(n)*n

算法实现:

首先是快速排序的实现

void quickSort(int A[], int low, int high){
      if(low < high){
        int i = low, j = high, key = A[i];
        while(i < j){
           while(i < j && A[j] > key) // 从右向左找第一个小于key的数
              --j;
            if(i < j)
              A[i++] = A[j];
            while(i < j && A[i] < key) // 从左向右找第一个大于等于key的数
              ++i;
            if(i < j)
              A[j--] = A[i];
        }
        A[i] = key;                              //mid
        quickSort(A,low,i-1);
        quickSort(A,i+1,high);
      }
}
时间: 2024-11-03 22:32:12

各种排序的实现与复杂度分析(持续更新)的相关文章

常用排序算法 - 稳定性和复杂度分析

一.前言 上一篇,只是简单的记录了常用算法的主要思想以及代码实现( 常用算法记录 ); 这次简单的记录一下算法的稳定性以及复杂度 二.稳定性 1. 稳定性的定义 如果两个相等的数据的先后位置,排序前后保持不变的话,那就是稳定的,反之,就是不稳定: 例如:A[i] == A[j] , A[i]的位置在A[j]之前,排序后,A[i]的位置依然在A[j]之前: 2. 稳定性的好处 (1)如果排序算法是稳定的,那么从一个键上排序,然后再从另一个键上排序,第一个键排序的结果可以为第二个键排序所利用. 基数

基于不同系统下的i++不同的运算结果分析——持续更新

在vs2013环境下的运行情况 #include<stdio.h> #include<stdlib.h> int main() { int i = 1; int j = (++i) + (++i) + (++i); printf("%d", j); system("pause"); return 0; } 在vc6.0环境下的运行情况 #include<stdio.h> int main() { int i=1; int j=(+

比较排序算法及复杂度分析

比较排序算法分类 比较排序(Comparison Sort)通过对数组中的元素进行比较来实现排序. 比较排序算法(Comparison Sorts) Category Name Best Average Worst Memory Stability  插入排序  (Insertion Sorts) 插入排序 (Insertion Sort) n n2 n2 1 Stable 希尔排序 (Shell Sort) n n log2 n n log2 n 1 Not Stable  交换排序 (Exc

排序算法的时空复杂度、稳定性分析

1.基本概念 2.时空复杂度 3.稳定性 4.使用情况分析 排序算法总结(C语言版)已介绍排序算法的基本思想和C语言实现,本文只介绍时空复杂度和稳定性. 1.基本概念 时间复杂度: 一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多.一个算法的语句执行次数称为语句频度或时间频度.记为T(n).n称为问题的规模,当n不断变化时,时间频度T(n)也会不断变化.但有时我们想知道它变化时呈现什么规律,为此,引入时间复杂度概念.若有某个辅助函数f(n),使得当n趋近

八大排序算法——冒泡排序(动图演示 思路分析 实例代码java 负杂度分析)

一.动图演示 二.思路分析 1.  相邻两个数两两相比,n[i]跟n[j+1]比,如果n[i]>n[j+1],则将连个数进行交换, 2.  j++, 重复以上步骤,第一趟结束后,最大数就会被确定在最后一位,这就是冒泡排序又称大(小)数沉底, 3.  i++,重复以上步骤,直到i=n-1结束,排序完成. 三.负杂度分析 1.  不管原始数组是否有序,时间复杂度都是O(n2), 因为没一个数都要与其他数比较一次,(n-1)2次,分解:n2+2n-1,  去掉低次幂和常数,剩下n2,所以最后的时间复杂

八大排序算法——堆排序(动图演示 思路分析 实例代码java 复杂度分析)

一.动图演示 二.思路分析 先来了解下堆的相关概念:堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆:或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆.如下图: 同时,我们对堆中的结点按层进行编号,将这种逻辑结构映射到数组中就是下面这个样子 该数组从逻辑上讲就是一个堆结构,我们用简单的公式来描述一下堆的定义就是: 大顶堆:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2]   小顶堆:arr[i]

转 算法复杂度分析

转自 http://www.cnblogs.com/gaochundong/p/complexity_of_algorithms.html 为什么要进行算法分析? 预测算法所需的资源 计算时间(CPU 消耗) 内存空间(RAM 消耗) 通信时间(带宽消耗) 预测算法的运行时间 在给定输入规模时,所执行的基本操作数量. 或者称为算法复杂度(Algorithm Complexity) 如何衡量算法复杂度? 内存(Memory) 时间(Time) 指令的数量(Number of Steps) 特定操作

01 | 复杂度分析(上):如何分析、统计算法的执行效率和资源消耗?

我们都知道,数据结构和算法本身解决的是“快”和“省”的问题,即如何让代码运行得更快,如何让代码更省存储空间.所以,执行效率是算法一个非常重要的考量指标.那如何来衡量你编写的算法代码的执行效率呢?这里就要用到我们今天要讲的内容:时间.空间复杂度分析.其实,只要讲到数据结构与算法,就一定离不开时间.空间复杂度分析. 而且,我个人认为,复杂度分析是整个算法学习的精髓,只要掌握了它,数据结构和算法的内容基本上就掌握了一半.其实,只要讲到数据结构与算法,就一定离不开时间.空间复杂度分析. 复杂度分析实在太

复杂度分析(上):如何分析、统计算法的执行效率和资源消耗

复杂度分析是什么? 复杂度分析就是分析执行一个给定算法需要消耗的计算资源数量(例如计算时间,存储器使用等)的过程. 为什么要学习复杂度分析? 没有复杂度分析怎么得到算法执行的时间和占用的内存大小 把代码运行一遍,通过统计.监控,就能得到算法执行的时间和占用的内存大小. 该方法的缺点在于: 1.测试结果非常依赖测试环境 拿同样一段代码,在 Intel Core i9 处理器上运行的速度肯定要比 Intel Core i3 快得多.同一段代码,在不同机器上运行,也可能会有截然相反的结果. 2.测试结