热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

算法与数据结构深入解析:冒泡、插入、选择及希尔排序的性能对比分析

本文深入解析了计算机科学领域中常用的几种排序算法,包括冒泡排序、插入排序、选择排序和希尔排序。通过对这些算法的性能进行详细对比分析,探讨了它们在不同数据规模和分布情况下的优劣。研究结果表明,冒泡排序虽然实现简单,但在大多数情况下效率较低;插入排序在部分有序的数据集中表现较好;选择排序的时间复杂度较为稳定,但空间复杂度较高;而希尔排序通过引入增量序列显著提高了排序效率,适用于大规模数据集。

冒泡排序

冒泡排序(Bubble Sort),是一种 计算机科学领域的较简单的 排序算法。
它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名。

算法原理:

冒泡排序算法的运作如下:(从后往前)

  • 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
  • 针对所有的元素重复以上的步骤,除了最后一个。
  • 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

时间复杂度:

若文件的初始状态是正序的,一趟扫描即可完成排序。
所需的关键字比较次数C和记录移动次数M均达到最小值。
Cmin = n-1; Mmin = 0;
所以,冒泡排序最好的 时间复杂度为O(n)
若初始文件是反序的,需要进行n-1趟排序。每趟排序要进行n-i次关键字的比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值:

冒泡排序的最坏时间复杂度为

最坏情况

综上,因此冒泡排序总的平均时间复杂度为O(n^2)

#include
#include
#include "SortTestHelper.h"
#include "SelectionSort.h"
#include "InsertionSort.h"using namespace std;template
void bubbleSort( T arr[] , int n){bool swapped;//是否交换过do{swapped = false;//将交换过置为flasefor( int i = 1 ; i arr[i] ){swap( arr[i-1] , arr[i] );//往后浮了之后,置标志位为true。swapped = true;//true进入下一次循环。}// 优化, 每一趟Bubble Sort都将最大的元素放在了最后的位置// 所以下一次排序, 最后的元素可以不再考虑n --;}while(swapped);//
}int main() {int n &#61; 10000;// Test for Random Arraycout<<"Test for Random Array, size &#61; "<}

运行结果&#xff1a;

三种排序运行时间对比

可以看出在面对随机乱序的数组时&#xff0c;时间&#xff1a;冒泡排序>选择排序>插入排序
在面对几乎有序的数组时&#xff1a;冒泡>选择>插入

优化过的插入排序还是很棒的。

希尔排序&#xff1a;

#include
#include "SortTestHelper.h"
#include "SelectionSort.h"
#include "InsertionSort.h"
#include "BubbleSort.h"using namespace std;template
void shellSort(T arr[], int n){int h &#61; 1;while( h &#61; 1 ){// h-sort the arrayfor( int i &#61; h ; i &#61; h && e }int main() {int n &#61; 10000;// Test for Random Arraycout<<"Test for Random Array, size &#61; "<}

运行结果&#xff1a;

希尔排序运行结果

可以得出结论希尔排序属于基础排序算法里效果相当好的一个了。




推荐阅读
author-avatar
诡道89_431
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有