各种排序算法比较

排序方法稳定性总结 文章目录前言一、排序算法稳定性是什么?二、各个算法解析1.选择排序2.冒泡排序3.插入排序4. 归并排序5.快速排序6.堆排序7.桶排序思想的算法总结 前言 这次将介绍各种排序算法的稳定性和一些小结论 一、排序算法稳定性是什么? 它说的是,当一个排序算法对一个数组排序的时候,两个相同的数,在排序后相对位置有没有发生变化。没有则稳定 二、各个算法解析 1.选择排序 选择排序算法是不稳定的,它是先遍历一次数组,找到一个最小值,和已排好序的边界后一个元素交换。这个交换的步骤就让选择排序变得不稳定。如果交换过. 阅读详情
 1.稳定性比较
插入排序、冒泡排序、二叉树排序、二路归并排序及其他线形排序是稳定的


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


2.时间复杂性比较


 


    平均情况 最好情况 最坏情况
归并排序 O(nlogn) O(nlogn) O(nlogn)
基数排序 O(n) O(n) O(n)
快速排序 O(nlogn) O(nlogn) O(n2)
希尔排序 O(n1.5) O(n) O(n1.5)
插入排序 O(n2) O(n) O(n2)
选择排序


O(n2) O(n2) O(n2)
 


 


 


 


 


 


 


 


 


 


 


 


3.辅助空间的比较


线形排序、二路归并排序的辅助空间为O(n),其它排序的辅助空间为O(1);


4.其它比较


插入、冒泡排序的速度较慢,但参加排序的序列局部或整体有序时,这种排序能达到较快的速度。


反而在这种情况下,快速排序反而慢了。


当n较小时,对稳定性不作要求时宜用选择排序,对稳定性有要求时宜用插入或冒泡排序。


若待排序的记录的关键字在一个明显有限范围内时,且空间允许是用桶排序。


当n较大时,关键字元素比较随机,对稳定性没要求宜用快速排序。


当n较大时,关键字元素可能出现本身是有序的,对稳定性有要求时,空间允许的情况下。


宜用归并排序。


当n较大时,关键字元素可能出现本身是有序的,对稳定性没有要求时宜用堆排序。


*************************************************************************************




重温经典排序思想--C语言常用排序全解


/*
=============================================================================
相关知识介绍(所有定义只为帮助读者理解相关概念,并非严格定义):
1、稳定排序和非稳定排序


简单地说就是所有相等的数经过某种排序方法后,仍能保持它们在排序之前的相对次序,我们就
说这种排序方法是稳定的。反之,就是非稳定的。
比如:一组数排序前是a1,a2,a3,a4,a5,其中a2=a4,经过某种排序后为a1,a2,a4,a3,a5,
则我们说这种排序是稳定的,因为a2排序前在a4的前面,排序后它还是在a4的前面。假如变成a1,a4,
a2,a3,a5就不是稳定的了。


2、内排序和外排序


在排序过程中,所有需要排序的数都在内存,并在内存中调整它们的存储顺序,称为内排序;
在排序过程中,只有部分数被调入内存,并借助内存调整数在外存中的存放顺序排序方法称为外排序。


3、算法的时间复杂度和空间复杂度


所谓算法的时间复杂度,是指执行算法所需要的计算工作量。
一个算法的空间复杂度,一般是指执行这个算法所需要的内存空间。
================================================================================
*/
/*
================================================
功能:选择排序
输入:数组名称(也就是数组首地址)、数组中元素个数
================================================
*/
/*
====================================================
算法思想简单描述:


在要排序的一组数中,选出最小的一个数与第一个位置的数交换;
然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环
到倒数第二个数和最后一个数比较为止。


选择排序是不稳定的。算法复杂度O(n2)--[n的平方]
=====================================================
*/
void select_sort(int *x, int n)
{
int i, j, min, t;


for (i=0; i<n-1; i++) /*要选择的次数:0~n-2共n-1次*/
{
   min = i; /*假设当前下标为i的数最小,比较后再调整*/
   for (j=i+1; j<n; j++)/*循环找出最小的数的下标是哪个*/
   {
    if (*(x+j) < *(x+min))
    {   
     min = j; /*如果后面的数比前面的小,则记下它的下标*/
    }
   }  
  
   if (min != i) /*如果min在循环中改变了,就需要交换数据*/
   {
    t = *(x+i);
    *(x+i) = *(x+min);
    *(x+min) = t;
   }
}
}




/*
================================================
功能:直接插入排序
输入:数组名称(也就是数组首地址)、数组中元素个数
================================================
*/
/*
====================================================
算法思想简单描述:


在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排
好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数
也是排好顺序的。如此反复循环,直到全部排好顺序。


直接插入排序是稳定的。算法时间复杂度O(n2)--[n的平方]
=====================================================
*/
void insert_sort(int *x, int n)
{
int i, j, t;


for (i=1; i<n; i++) /*要选择的次数:1~n-1共n-1次*/
{
   /*
    暂存下标为i的数。注意:下标从1开始,原因就是开始时
    第一个数即下标为0的数,前面没有任何数,单单一个,认为
    它是排好顺序的。
   */
   t=*(x+i);
   for (j=i-1; j>=0 && t<*(x+j); j--) /*注意:j=i-1,j--,这里就是下标为i的数,在它前面有序列中找插入位置。*/
   {
    *(x+j+1) = *(x+j); /*如果满足条件就往后挪。最坏的情况就是t比下标为0的数都小,它要放在最前面,j==-1,退出循环*/
   }


   *(x+j+1) = t; /*找到下标为i的数的放置位置*/
}
}




/*
================================================
功能:冒泡排序
输入:数组名称(也就是数组首地址)、数组中元素个数
================================================
*/
/*
====================================================
算法思想简单描述:


在要排序的一组数中,对当前还未排好序的范围内的全部数,自上
而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较
小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要
求相反时,就将它们互换。


下面是一种改进的冒泡算法,它记录了每一遍扫描后最后下沉数的
位置k,这样可以减少外层循环扫描的次数。


冒泡排序是稳定的。算法时间复杂度O(n2)--[n的平方]
=====================================================
*/


void bubble_sort(int *x, int n)
{
int j, k, h, t;
  
for (h=n-1; h>0; h=k) /*循环到没有比较范围*/
{
   for (j=0, k=0; j<h; j++) /*每次预置k=0,循环扫描后更新k*/
   {
    if (*(x+j) > *(x+j+1)) /*大的放在后面,小的放到前面*/
    {
     t = *(x+j);
     *(x+j) = *(x+j+1);
     *(x+j+1) = t; /*完成交换*/
     k = j; /*保存最后下沉的位置。这样k后面的都是排序排好了的。*/
    }
   }
}
}




/*
================================================
功能:希尔排序
输入:数组名称(也就是数组首地址)、数组中元素个数
================================================
*/
/*
====================================================
算法思想简单描述:


在直接插入排序算法中,每次插入一个数,使有序序列只增加1个节点,
并且对插入下一个数没有提供任何帮助。如果比较相隔较远距离(称为
增量)的数,使得数移动时能跨过多个元素,则进行一次比较就可能消除
多个元素交换。D.L.shell于1959年在以他名字命名的排序算法中实现
了这一思想。算法先将要排序的一组数按某个增量d分成若干组,每组中
记录的下标相差d.对每组中全部元素进行排序,然后再用一个较小的增量
对它进行,在每组中再进行排序。当增量减到1时,整个要排序的数被分成
一组,排序完成。


下面的函数是一个希尔排序算法的一个实现,初次取序列的一半为增量,
以后每次减半,直到增量为1。


希尔排序是不稳定的。
=====================================================
*/
void shell_sort(int *x, int n)
{
int h, j, k, t;


for (h=n/2; h>0; h=h/2) /*控制增量*/
{
   for (j=h; j<n; j++) /*这个实际上就是上面的直接插入排序*/
   {
    t = *(x+j);
    for (k=j-h; (k>=0 && t<*(x+k)); k-=h)
    {
     *(x+k+h) = *(x+k);
    }
    *(x+k+h) = t;
   }
}
}




/*
================================================
功能:快速排序
输入:数组名称(也就是数组首地址)、数组中起止元素的下标
================================================
*/
/*
====================================================
算法思想简单描述:


快速排序是对冒泡排序的一种本质改进。它的基本思想是通过一趟
扫描后,使得排序序列的长度能大幅度地减少。在冒泡排序中,一次
扫描只能确保最大数值的数移到正确位置,而待排序序列的长度可能只
减少1。快速排序通过一趟扫描,就能确保某个数(以它为基准点吧)
的左边各数都比它小,右边各数都比它大。然后又用同样的方法处理
它左右两边的数,直到基准点的左右只有一个元素为止。它是由
C.A.R.Hoare于1962年提出的。


显然快速排序可以用递归实现,当然也可以用栈化解递归实现。下面的
函数是用递归实现的,有兴趣的朋友可以改成非递归的。


快速排序是不稳定的。最理想情况算法时间复杂度O(nlog2n),最坏O(n2)


=====================================================
*/
void quick_sort(int *x, int low, int high)
{
int i, j, t;


if (low < high) /*要排序的元素起止下标,保证小的放在左边,大的放在右边。这里以下标为low的元素为基准点*/
{
   i = low;
   j = high;
   t = *(x+low); /*暂存基准点的数*/


   while (i<j) /*循环扫描*/
   {
    while (i<j && *(x+j)>t) /*在右边的只要比基准点大仍放在右边*/
    {
     j--; /*前移一个位置*/
    }


    if (i<j) 
    {
     *(x+i) = *(x+j); /*上面的循环退出:即出现比基准点小的数,替换基准点的数*/
     i++; /*后移一个位置,并以此为基准点*/
    }


    while (i<j && *(x+i)<=t) /*在左边的只要小于等于基准点仍放在左边*/
    {
     i++; /*后移一个位置*/
    }


    if (i<j)
    {
     *(x+j) = *(x+i); /*上面的循环退出:即出现比基准点大的数,放到右边*/
     j--; /*前移一个位置*/
    }
   }


   *(x+i) = t; /*一遍扫描完后,放到适当位置*/
   quick_sort(x,low,i-1);   /*对基准点左边的数再执行快速排序*/
   quick_sort(x,i+1,high);   /*对基准点右边的数再执行快速排序*/
}
}




/*
================================================
功能:堆排序
输入:数组名称(也就是数组首地址)、数组中元素个数
================================================
*/
/*
====================================================
算法思想简单描述:


堆排序是一种树形选择排序,是对直接选择排序的有效改进。
堆的定义如下:具有n个元素的序列(h1,h2,...,hn),当且仅当
满足(hi>=h2i,hi>=2i+1)或(hi<=h2i,hi<=2i+1)(i=1,2,...,n/2)
时称之为堆。在这里只讨论满足前者条件的堆。


由堆的定义可以看出,堆顶元素(即第一个元素)必为最大项。完全二叉树可以
很直观地表示堆的结构。堆顶为根,其它为左子树、右子树。
初始时把要排序的数的序列看作是一棵顺序存储的二叉树,调整它们的存储顺序,
使之成为一个堆,这时堆的根节点的数最大。然后将根节点与堆的最后一个节点
交换。然后对前面(n-1)个数重新调整使之成为堆。依此类推,直到只有两个节点
的堆,并对它们作交换,最后得到有n个节点的有序序列。


从算法描述来看,堆排序需要两个过程,一是建立堆,二是堆顶与堆的最后一个元素
交换位置。所以堆排序有两个函数组成。一是建堆的渗透函数,二是反复调用渗透函数
实现排序的函数。


堆排序是不稳定的。算法时间复杂度O(nlog2n)。


*/
/*
功能:渗透建堆
输入:数组名称(也就是数组首地址)、参与建堆元素的个数、从第几个元素开始
*/
void sift(int *x, int n, int s)
{
int t, k, j;


t = *(x+s); /*暂存开始元素*/
k = s;   /*开始元素下标*/
j = 2*k + 1; /*右子树元素下标*/


while (j<n)
{
   if (j<n-1 && *(x+j) < *(x+j+1))/*判断是否满足堆的条件:满足就继续下一轮比较,否则调整。*/
   {
    j++;
   }


   if (t<*(x+j)) /*调整*/
   {
    *(x+k) = *(x+j);
    k = j; /*调整后,开始元素也随之调整*/
    j = 2*k + 1;
   }
   else /*没有需要调整了,已经是个堆了,退出循环。*/
   {
    break;
   }
}


*(x+k) = t; /*开始元素放到它正确位置*/
}




/*
功能:堆排序
输入:数组名称(也就是数组首地址)、数组中元素个数
*/
void heap_sort(int *x, int n)
{
int i, k, t;
int *p;


for (i=n/2-1; i>=0; i--)
{
   sift(x,n,i); /*初始建堆*/
}


for (k=n-1; k>=1; k--)
{
   t = *(x+0); /*堆顶放到最后*/
   *(x+0) = *(x+k);
   *(x+k) = t;
   sift(x,k,0); /*剩下的数再建堆*/ 
}
}




void main()
{ 
#define MAX 4
int *p, i, a[MAX];


/*录入测试数据*/
p = a;
printf("Input %d number for sorting :/n",MAX);
for (i=0; i<MAX; i++)
{
   scanf("%d",p++);
}
printf("/n");


/*测试选择排序*/




p = a;
select_sort(p,MAX);
/**/




/*测试直接插入排序*/


/*
p = a;
insert_sort(p,MAX);
*/




/*测试冒泡排序*/


/*
p = a;
insert_sort(p,MAX);
*/


/*测试快速排序*/


/*
p = a;
quick_sort(p,0,MAX-1);
*/


/*测试堆排序*/


/*
p = a;
heap_sort(p,MAX);
*/


for (p=a, i=0; i<MAX; i++)
{
   printf("%d ",*p++);
}


printf("/n");
system("pause");
}


堆排序与冒泡排序的比较 堆排序的过程是首先建立小顶堆(或者大顶堆),这个堆的特征是根节点不大于(或者不小于)任何子节点。建立之后就可以通过每次取出堆中的第一个元素(这个堆的最小值或最大值)然后将新的堆调整从而下次再取第一个这种循环操作来得到一个有序的序列。 在建立堆的过程中都是从最后一个根节点开始,因为纯叶子节点不用处理,它已经是小顶堆了(因为没有子节点所以也满足特征),处理完一个根节点,就接着处理上一个一直到第一个元 阅读详情

相关推荐

内部排序算法比较(超详解)

一、题目描述 通过随机数据比较各排序算法的关键字比较次数和关键字移动次数,以 及执行时间,取得直观感受。 二、设计要求一、需求分析 实现各排序算法,分别进行以下各组比较,并进行总结。 一、各算法在不同规模下的比较。 1)比较范围:直接插入排序、冒泡法排序、简单选择排序、快速排序1(自己实现)、快速排序2(调用STL)、归并排序。 2)比较指标:a)关键字操作次数(比较次数和移动次数

u011446963的博客 1万+

常用排序算法稳定性

前言: 什么是稳定性? 定义:排序前后两个相等的数相对位置不变,则算法稳定。 总述: 各排序算法的稳定性: 堆排序、快速排序、希尔排序、直接选择排序不是稳定的排序算法; 基数排序、冒泡排序、直接插入排序、折半插入排序、归并排序是稳定的排序算法。 一、冒泡排序 小的元素往前调或者把大的元素往后调; 比较是相邻的两个元素,那么交换也发生在这两个元素之间; 很显然是稳定性排序算法。 二、选择排序 每个位置选择当前元素最小的; 在一趟选择中,如果当前元素比一个元素小,而该小的元素

weixin_43743711的博客 5454

七大基于比较的排序算法

所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作

2302_80192828的博客 1705

各种排序算法的稳定性及效率比较

1.稳定性比较 1) 稳定的:如果存在多个具有相同排序码的记录,经过排序后,这些记录的相对次序仍然保持不变,则这种排序算法称为稳定的。     插入排序、冒泡排序、归并排序、分配排序(桶式、基数)都是稳定的排序算法。2)不稳定的:否则称为不稳定的。直接选择排序、堆排序、shell排序、快速排序都是不稳定的排序算法。 插入排序、冒泡排序、二叉树排序、二路归并排序及其他线形排序是稳定的选择排序、希尔排

Cottage驿站 2870

VS2015编译配置GDAL(图文并茂、超详细!!!)

文章目录一、GDAL介绍二、下载GDAL三、修改源代码四、工具命令提示符操作五、编译GDAL六、安装GDAL七、在VS2015的项目中配置GDAL八、添加环境变量九、测试是否配置成功 一、GDAL介绍 GDAL(Geospatial Data Abstraction Library)是一个在XMIT许可协议下的开源栅格空间数据转换库。它利用抽象数据模型来表达所支持的各种文件格式。它还有一系列命令行工具来进行数据转换和处理。OGR是GDAL项目的一个分支,功能与GDAL类似,只不过它提供对矢量数据的支持。因此

weixin_46196863的博客 3756

项目实训(四)——SAM模型的学习与部署

这里的show_mask就是我们用mask的prompt进行分割,show_points就是我们用points进行分割,show_box就是通过box进行分割,这是SAM的三种prompt的方式。总的来说,Meta AI 的 Segment Anything 模型为我们提供了一种全新的物体识别和分割方式,其强大的泛化能力和广泛的应用前景将极大地推动计算机视觉领域的发展。这里有vit_h、vit_b、vit_l三种权重模型,这里可以根据自己的需要下载相应的权重模型。我们是下载的vit_h权重模型。

yyyyyyyx_的博客 1421

8种常用排序算法稳定性分析

选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法 冒泡排序、插入排序、归并排序和基数排序都是稳定的排序算法。 【1】为什么要区分排序算法的稳定性? 排序算法的稳定性通俗地讲就是能保证排序前两个相等的数据其在序列中的先后位置顺序与排序后它们两个先后位置顺序相同。 再简单具体一点,如果A i == A j,Ai 原来在 Aj 位置前,排序后 Ai仍然是在 Aj 位置前。 下面我们分析一下稳定性的......

小小默:进无止境 1万+

《内部排序算法比较》

《内部排序算法比较》 一、【问题描述】 在教科书中,各种内部排序算法的时间复杂度分析结果只给出算法的大致执行时间。试通过随机数据比较各算法的关键字比较次数和关键字移动次数,以获得直观感受 【基本要求】 (1) 对6种常用内部排序算法进行比较:冒泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、堆排序 (2) 待排序的表长不小于100,其中数据要用伪随机数产生,至少用5组不同的输入数据做比较 ...

mufen之内部排序算法比较 8848

宏基因组分析|从Binning到MAG优化的全流程实战指南

本文提供了一份宏基因组分析从Binning到MAG优化的全流程实战指南。详细解析了宏基因组分箱(Binning)的核心原理与必要性,并手把手指导如何利用Bowtie2、MetaBAT2和CheckM等工具构建分箱流水线,进行质量评估与筛选,最终获得高质量宏基因组组装基因组(MAG)。文章还分享了常见问题排查与进阶优化策略,为后续物种分类、功能注释等深度分析奠定坚实基础。

weixin_29260291的博客 455

Zabbix-获取客户端的SNMP数据

网口状态(ifOperStatus)的 OID 是1.3.6.1.2.1.2.2.1.8,查询时需要用1.3.6.1.2.1.2.2.1.8.1(第 1 个网口)、1.3.6.1.2.1.2.2.1.8.2(第 2 个网口)等。表格对象是指 “包含多个同类实例的对象”(如设备的多个网口、多个进程等,每个实例需要单独标识)。在 SNMP 规范中,标量对象的完整 OID 必须以.0结尾,.0是标量对象的唯一实例编号。标量对象是指 “单一值的对象”(如设备的名称、温度、状态等,整个设备只需要一个值来表示)。

徐子元 1727

比较排序算法

http://www.cnblogs.com/gaochundong/p/comparison_sorting_algorithms.html 比较排序算法分类 比较排序(Comparison Sort)通过对数组中的元素进行比较来实现排序。 比较排序算法(Comparison Sorts) Category Name ...

kebu12345678的博客 918

用limma包进行多组差异表达分析

写在前面:最近在使用limma包进行差异表达分析,参考了网上许多教程都觉得说的云里雾里,很不清楚。经过我自己一段时间非常痛苦的钻研,弄明白了,解决了我的实际需求。于是决定将我的分析经验写下来,分享给需要的人。 首先加载前期预处理好的表达矩阵。(我的原始表达矩阵文件已附在文后,大家有需要可以下载实践) setwd("E://Rworkplace") data<-read.table...

weixin_40640700的博客 4万+

各种排序算法总结和比较

排序算法可以说是一项基本功,解决实际问题中经常遇到,针对实际数据的特点选择合适的排序算法可以使程序获得更高的效率,有时候排序的稳定性还是实际问题中必须考虑的,这篇博客对常见的排序算法进行整理,包括:插入排序、选择排序、冒泡排序、快速排序、堆排序、归并排序、希尔排序、二叉树排序、计数排序、桶排序、基数排序。 代码都经过了CodeBlocks的调试,但是很可...

3726

多跳问答技术解析:从原理到金融领域实践

多跳问答(Multi-hop QA)是自然语言处理中的高级任务,要求系统通过多步推理整合分散信息来回答问题。其核心技术在于理解文档间的复杂关联,相比单跳问答需要更精细的数据集设计和模型架构。在金融、医疗等专业领域,多跳问答能有效处理如'腾讯大股东投资的港股上市公司'这类需要串联多个信息点的问题。典型实现方案包括MR-Search框架的三级检索器设计,分别处理实体召回、关系匹配和数值比较。当前最佳实践表明,结合稠密检索与稀疏检索的混合策略,配合动态路由机制,能在保持较高精度的同时控制计算成本。这类技术在金融风

weixin_42566072的博客 606

Claude Code 源码一夜流出:会看热闹的人很多,会读源码的人很少

摘要:Claude Code源码意外泄露后,作者分享了高效的源码学习方法:1)Fork仓库保存代码;2)使用Qoder的Repo Wiki功能生成结构化文档和UML图;3)基于Wiki创建可复用的Skill。这种方法比直接让AI总结代码更系统深入,并推荐了可视化学习项目辅助理解。文章强调实践的重要性,提供了具体工具和操作指南。

720

十大排序算法比较

前言 在竞赛中,可以使用 C++ STL 的sort函数来直接进行排序(小学阶段足够了),但作为最基本的算法问题之一,各种排序算法中包含了许多二分、分治等重要的算法思想,也是掌握很多其他算法的重要基础。因此,如果想在算法上更加深入地往下学习,那么几种非常重要的排序算法,比如快速排序、归并排序、计数排序等,还是要能够同时掌握其算法思想和代码实现的。下面给出各种经典排序算法的比较: 0、排序算法概述 0.1 算法分类 十种常见排序算法可以分为两大类: 比较类排序:通过比较来决定元素间的相对次序,由..

10247D的博客 1577

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

读论文之《基于 FPGA 的并行全比较排序算法》

为什么介绍这种排序算法:最近在独立编写霍夫曼编码的verilog HDL设计程序,其中用到了排序模块,对一组数据进行排序,苦寻几天,最终找到了这个全新的适合硬件实现的排序算法,分享与此,以空间换时间的并行排序算法。十分感谢论文作者,看到这样的方法,我太激动了。并行全比较排序算法介绍:排序是一种重要的数据运算,传统的排序方法主要靠软件串行方式实现,包括冒泡法、选择法、计数法等,这些算法大多采用循环比...

Reborn Lee 9206

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

内部排序算法比较

排序算法是数据结构学科经典的内容,其中内部排序现有的算法有很多种,究竟各有什么特点呢?本文力图设计实现常用内部排序算法并进行比较。分别为起泡排序,直接插入排序,简单选择排序,快速排序,堆排序,针对关键字的比较次数和移动次数进行测试比较.问题分析和总体设计ADT OrderableList{           数据对象:D={ai| ai∈IntegerSet,i=1,2,…,n,n≥0}  

wuhongze的专栏 4722

常用排序算法总结(1)-- 比较排序

我们通常所说的排序算法往往指的是内部排序算法,即数据记录在内存中进行排序。排序算法大体可分为两种:一种是比较排序,时间复杂度O(nlogn) ~ O(n^2),主要有:冒泡排序,选择排序,插入排序,归并排序,堆排序,快速排序等。另一种是非比较排序,时间复杂度可以达到O(n),主要有:计数排序,基数排序,桶排序等。这里我们来探讨一下常用的比较排序算法,非比较排序算法将在下一篇文章中介绍。下表给出了常...

vincent 1万+

基于比较的常用排序算法总结

基于比较的排序算法,应该是最符合人们直觉的方法。在各种算法的技术书上,已经证明了基于比较的排序算法的时间最优复杂度为O(nlogn)。 下面是几种常见的基于比较的排序算法: 1. 选择排序:这应该是最直观的排序方法。在排序n个元素时,第一次遍历,找到最小的元素,将其与第一个元素互换;第二次遍历,找到次小的元素,将其与第二个元素交换;直至剩下最后一个元素。 2. 冒泡排序:...

weixin_30407099的博客 5725

比较排序算法概述

上述输入序列的元素序列:6,8,5根据插入排序算法构建的插入排序决策树排序目标时升序排列最坏的情况下需要从根结点比较到最长路径的叶子结点最好的能够确定全序列有序情况是:a1>a2a_1>a_2a1​>a2​a1

xuchaoxin1375的博客 876

七大比较排序算法

时间复杂度空间复杂度稳定性插入排序O(N)O(N2稳定希尔排序O(N1.3O(1)不稳定选择排序O(N2O(1)不稳定堆排序O(N * log2N)O(1)不稳定冒泡排序O(N2O(1)稳定快速排序O(N * log2N)O(log2N)不稳定归并排序O(N * log2N)O(N)稳定。

ijj_zZ的博客 1140

对比 几种 排序算法 的 比较次数

今天在实际项目中遇到了一个排序问题,对Object排序,其中比较操作特别耗时,而交换操作的时间可以忽略不计,这样就不能用之前一直了解的最佳实践的快速排序了,得重新评价各种排序算法的比较次数,因此做了以下实验:对比了在处理相同长度的随机数组排序时,各种排序的比较次数: 实验结果输出如下:(注:里面InsertSort使用的是二分插入排序) 10 numbers: Bubbl...

agkn25038的博客 2948

《数据结构》之内部排序算法比较

前言 各种内部排序算法的时间复杂度分析结果只给出了算法执行时间的阶,或大概执行时间。试通过随机的数据比较各算法的关键字比较次数和关键字移动次数,以取得直观感受。 基本要求: (1) 从以下常用的内部排序算法至少选取5种进行比较:直接插入排序;折半折入排序;希尔排序;起泡排序;快速排序;简单选择排序;堆排序;归并排序。 (2) 待排序表的表长为20000;其中的数据要用伪随机数产生程序产生;至少要用5组不同的输入数据作比较;比较的指标为有关键字参加的比较次数和关键字移动次数(关键字交换计为3次移动)。 直接上

小小前端攻城狮的博客 7635
上一篇: SQL语句大全
下一篇: javascript:history.go()和History.back()的区别
HackProgramer
博客等级 码龄12年 255粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值